java 数据库基本操作 `}PYltW
1、java数据库操作基本流程 uNzc,OH
2、几个常用的重要技巧: I$7eiW @
可滚动、更新的记录集 O_:l;D#i
批量更新 9wWBE<}>u
事务处理 SB\%"nnV
MoIh=rw
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 D`LBv,n
1、取得数据库连接 P"vrYom
1)用DriverManager取数据库连接 *HKw;I
例子 y"q
aa
String className,url,uid,pwd; /\8Il+0
className = "oracle.jdbc.driver.OracleDriver"; TQ4@|S:OF
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; |H5.2P&9-5
uid = "system"; cszvt2BIg
pwd = "manager"; @ma(py
Class.forName(className); L80(9Y^xn
Connection cn = DriverManager.getConnection(url,uid,pwd); ntW@Fm:bw>
2)用jndi(java的命名和目录服务)方式 8 t5kou]h
例子 ]i*ucW4
String jndi = "jdbc/db";
po*G`b;v
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); /v R>.'
DataSource ds = (DataSource) ctx.lookup(jndi); 75^6?#GS
Connection cn = ds.getConnection(); c5YPV"X
多用于jsp中 LIZB!S@V \
2、执行sql语句 sl]<A[jR
1)用Statement来执行sql语句 @tH9$J*Y<
String sql; $GJT
Statement sm = cn.createStatement(); ot^p xun
sm.executeQuery(sql); // 执行数据查询语句(select) ffrIi',@
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ^|Q]WHNFB
2)用PreparedStatement来执行sql语句 }E
'r?N
String sql; #4^d#Gj
sql = "insert into user (id,name) values (?,?)"; UnhVppnex
PreparedStatement ps = cn.prepareStatement(sql); X ,QsE{
ps.setInt(1,xxx); A]z*#+Sl
ps.setString(2,xxx); V'vR(Wx
... O`5,L[i1y
ResultSet rs = ps.executeQuery(); // 查询
.Bm%
int c = ps.executeUpdate(); // 更新 =S&`~+
fj_23{,/"g
3、处理执行结果 r\Nfq(w
查询语句,返回记录集ResultSet ZitM<Qi&y
更新语句,返回数字,表示该更新影响的记录数 '/W$9jm
ResultSet的方法 gYKz,$
1、next(),将游标往后移动一行,如果成功返回true;否则返回false %M(RV_R+6
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 L44m!%q
AJPvwu}D
4、释放连接 Kgbm/L0XR*
cn.close(); oUv26t~
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection (j:
ptQ2$
Wlj&_~
可滚动、更新的记录集 t'qYM5
1、创建可滚动、更新的Statement ,lyW'<~gA
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); lPTx] =G
该Statement取得的ResultSet就是可滚动的 + ?1GscJ
2、创建PreparedStatement时指定参数 %q {q.(M#
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); EYAaK^ &
ResultSet.absolute(9000); Yd^@Ei9
批量更新 .|UQ)J?s
1、Statement ^kez]>
Statement sm = cn.createStatement(); m~=~DMj
sm.addBatch(sql1); ^Co-!jM
sm.addBatch(sql2); mB?x_6#d9
... V2MOD{Maat
sm.executeBatch() 7u):J
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 IrLGAQ0
2、PreparedStatement d$dy6{/YD
PreparedStatement ps = cn.preparedStatement(sql); p9(y b
{ tXD$HeBB?
ps.setXXX(1,xxx); g)D_!iz
... zkQ[<
ps.addBatch(); %bW_,b
} GIC1]y-'
ps.executeBatch(); u;#]eUk9}
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ]MbPivM
).k DY?s
事务的处理 qWt}8_"
1、关闭Connection的自动提交 VtreOJ+
cn.setAutoCommit(false); A'WR!*Yt
2、执行一系列sql语句 ?6#won
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close okNo-\Dh!
Statement sm ; ?$ r`T]>`2
sm = cn.createStatement(insert into user...); QTV*m>D
sm.executeUpdate(); E-e(K8R
sm.close(); /7Q|D sa
sm = cn.createStatement("insert into corp...); 7nZPh3%
sm.executeUpdate(); ,$P,x
sm.close(); bF)G+IH
3、提交 Y.tx$%
cn.commit(); 39pG-otJ
4、如果发生异常,那么回滚 k9|5TLXq?
cn.rollback();