java 数据库基本操作 ~$B,K]
1、java数据库操作基本流程 <S
qbj;
2、几个常用的重要技巧: PLD!BD
可滚动、更新的记录集 s6I]H
批量更新 <OUApp H
事务处理 c1i7Rc{q
>qCT#TY
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 0Ko,S(M_
1、取得数据库连接 hjE9[{K
1)用DriverManager取数据库连接 9p XFC9
例子 LPC7Bdjz
String className,url,uid,pwd; J0IK=Y
className = "oracle.jdbc.driver.OracleDriver"; A.[T#ZB.4
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; =LR UasF
uid = "system"; {q^KlSjm
pwd = "manager"; zv41Yv!x}
Class.forName(className); ee0J;pP2#
Connection cn = DriverManager.getConnection(url,uid,pwd); /bWV`*
2)用jndi(java的命名和目录服务)方式 !E%!,
例子 ,3wo
String jndi = "jdbc/db"; Vr'Z5F*@
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ,Gfnf%H\8>
DataSource ds = (DataSource) ctx.lookup(jndi); p:
o*=
Connection cn = ds.getConnection(); z,)Fvs4U.
多用于jsp中 m#Cp.|>kP4
2、执行sql语句 *;Vq0a!
1)用Statement来执行sql语句 m +gVGK
String sql; aUnm9ur
Statement sm = cn.createStatement(); O1z>A
sm.executeQuery(sql); // 执行数据查询语句(select) =c|Bu^(Ctw
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); =xgW$c/yB
2)用PreparedStatement来执行sql语句 {PU[MHZF
String sql; ]n{2cPx5d
sql = "insert into user (id,name) values (?,?)"; E^g6,Y:i9
PreparedStatement ps = cn.prepareStatement(sql); #\}hN~@F
ps.setInt(1,xxx); wdg[pt
/>
ps.setString(2,xxx); Th8xh=F[
... ;RU)Q)a)
ResultSet rs = ps.executeQuery(); // 查询 thh, V
int c = ps.executeUpdate(); // 更新 "-a>Uj")%
yHCc@`1.
3、处理执行结果 e"vEh
查询语句,返回记录集ResultSet eu#| |
更新语句,返回数字,表示该更新影响的记录数 _?{2{^v
ResultSet的方法 \R~Lf+q
1、next(),将游标往后移动一行,如果成功返回true;否则返回false #8PjYB
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ;,viE~n
:7R\"@V4
4、释放连接 b`^$2RM&
cn.close(); w:qwU\U>x
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection +/ #J]v-
IcA]<}0!"v
可滚动、更新的记录集 U9JqZ!
1、创建可滚动、更新的Statement ag3T[}L
z
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); y"2c; *7[{
该Statement取得的ResultSet就是可滚动的 (vQShe\
2、创建PreparedStatement时指定参数 DU;]Q:r{
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ^!A{ 4NV
ResultSet.absolute(9000); +Y.As
批量更新 IRpCbTIXK
1、Statement }\1V;T
Statement sm = cn.createStatement(); 5f1yszd
sm.addBatch(sql1); UPbG_ #"wZ
sm.addBatch(sql2); ;N)qNiJY
... y_\d[
sm.executeBatch() +ux,cx.U"
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Sna7r~j
2、PreparedStatement 9{+B lNZ
PreparedStatement ps = cn.preparedStatement(sql); F.JE$)B2EX
{ f5'+F-`N
ps.setXXX(1,xxx); ]+J]}C]\d
... -1fT2e
ps.addBatch(); HSTtDTo
} kg_TXB
ps.executeBatch(); zhFGMF1
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ll6~8PN
A6-JV8^
事务的处理 r l!c\
1、关闭Connection的自动提交 W4Zi?@L>'
cn.setAutoCommit(false); ^G5_d"Gr
2、执行一系列sql语句 yXlzImPn
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ."9v1kW
Statement sm ; :[,n`0lH
sm = cn.createStatement(insert into user...); 4O2O0\o:
sm.executeUpdate(); n`}vcVL;
sm.close(); ~~>D=~B0'
sm = cn.createStatement("insert into corp...); `2{x8A
sm.executeUpdate(); PE3l2kr
sm.close(); `^RpT]S
3、提交 uQrD}%GI
cn.commit(); B1 'Ds
4、如果发生异常,那么回滚 %|4Nmf$:Og
cn.rollback();