java 数据库基本操作 .mok.f<G_m
1、java数据库操作基本流程 u|QfCwQ
2、几个常用的重要技巧: x(S064
可滚动、更新的记录集 tY[y? DJ
批量更新 *\joaw
事务处理 l,v:[N
Qy6Avw/$
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ,%KB\;1mn'
1、取得数据库连接 (j-(fS
1)用DriverManager取数据库连接 >Mvt;'c
例子 ^2mXXAQf7^
String className,url,uid,pwd; }>Os@]*'^(
className = "oracle.jdbc.driver.OracleDriver"; w:umr#
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; BV!Kiw
uid = "system"; sL\|y38'
pwd = "manager"; pnqjATGU
Class.forName(className); &rNXn?>b
Connection cn = DriverManager.getConnection(url,uid,pwd); Hy `r}+
2)用jndi(java的命名和目录服务)方式 @EZXPU
例子 g` h>:5]
String jndi = "jdbc/db"; MI@ RdXkY
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); zM@iG]?kc
DataSource ds = (DataSource) ctx.lookup(jndi); 2<988F
Connection cn = ds.getConnection(); *50Ykf
多用于jsp中 Aga7X@fV(
2、执行sql语句 ikxSWO_Y=
1)用Statement来执行sql语句 hG
]j m
String sql; |Pj _L`G
Statement sm = cn.createStatement(); \DQ; v
sm.executeQuery(sql); // 执行数据查询语句(select) Jx{,x-I
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); X,OxvmDm
2)用PreparedStatement来执行sql语句 _X]?
String sql; |/<iydP
sql = "insert into user (id,name) values (?,?)"; m.^6ef
PreparedStatement ps = cn.prepareStatement(sql); @C!q S7k)
ps.setInt(1,xxx); ZDVaKDqZ_
ps.setString(2,xxx); gf3/ kll9
... 8wy"m=>=b}
ResultSet rs = ps.executeQuery(); // 查询 ]7VK&YfN
int c = ps.executeUpdate(); // 更新 u5,IH2BU
=Wjm_Rvk9
3、处理执行结果 >yWJk9hf
查询语句,返回记录集ResultSet 9Q.j
<
更新语句,返回数字,表示该更新影响的记录数 zc2,Mn2
ResultSet的方法 {==Q6BG*
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Lte\;Se.tu
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 WYh7Y
#15q`w
4、释放连接 [wu%t8O2
cn.close(); kh5V&%>?
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection }BfwMq4E)n
8WyG49eic
可滚动、更新的记录集 ##n\9ipD
1、创建可滚动、更新的Statement P,%|(qB
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); .9ROa#7U;n
该Statement取得的ResultSet就是可滚动的 S3=J1R,
2、创建PreparedStatement时指定参数 1U9iNki
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); *FAg^G&1
ResultSet.absolute(9000); N&ddO-r[s
批量更新 WI6er;D
1、Statement K{iayg!k
Statement sm = cn.createStatement(); *1%g=vb
sm.addBatch(sql1); {Ise (>V
sm.addBatch(sql2); \agC Q&
... ?3|ZS8y
sm.executeBatch() eU12*(
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 )l"0:1I g
2、PreparedStatement S4(IYnwN
PreparedStatement ps = cn.preparedStatement(sql); S_QDYnF)`
{ t^[{8,N
ps.setXXX(1,xxx); L{Th>]X
... 4Cfwz-Qo
ps.addBatch(); /;lk.-yU
} ECSC,oJ
ps.executeBatch(); [Ytia#Vv
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 %*/[aq, #
'v,W
gPe
事务的处理 =DCQ!02
1、关闭Connection的自动提交 /#
eBDo
cn.setAutoCommit(false); Ltj}>.+
2、执行一系列sql语句 l-Xxv
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close RS:0xN\JN
Statement sm ; MVj@0W33m
sm = cn.createStatement(insert into user...); q{@Wn]!k
sm.executeUpdate(); q3[LnmH
sm.close(); UkYQ<MNO
sm = cn.createStatement("insert into corp...); i3~!ofTb
sm.executeUpdate(); iIT<{m&`
sm.close(); "2h#inS
3、提交 lfKknp#B/O
cn.commit(); ZHBwoC#5}
4、如果发生异常,那么回滚 Z5U~g?
cn.rollback();