java 数据库基本操作 OQ4c#V?
1、java数据库操作基本流程 C+K=[
2、几个常用的重要技巧: w7-WUvxl
可滚动、更新的记录集 XD-^w_
批量更新 ,xths3.K
事务处理 gJ3c;
~^N]yb
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 uH\kQ9f
1、取得数据库连接 ?mRE'#
1)用DriverManager取数据库连接 },+~F8B
例子 #T~&]|{,
String className,url,uid,pwd; F9XT
lA
className = "oracle.jdbc.driver.OracleDriver"; !:fv>FEI9
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; NvtM3
uid = "system"; Wv K(G3
pwd = "manager"; fP%Fyg^k
Class.forName(className); (A/0@f1#
Connection cn = DriverManager.getConnection(url,uid,pwd); S<6k0b(,_3
2)用jndi(java的命名和目录服务)方式 S{p}ux[}=
例子 .dq
"k
String jndi = "jdbc/db";
N<JHjq
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); vz`@x45K
DataSource ds = (DataSource) ctx.lookup(jndi); 59B&2861
Connection cn = ds.getConnection(); tkuc/Z/@
多用于jsp中 Xt,X_o2m|]
2、执行sql语句 )u@c3?$6
1)用Statement来执行sql语句 |$hgT K[L
String sql; I__ 4I{nI
Statement sm = cn.createStatement(); ])y{BlZ
sm.executeQuery(sql); // 执行数据查询语句(select) zW4O4b$T
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ]UNZd/hIL
2)用PreparedStatement来执行sql语句 Fa3gJ[ZAqf
String sql; S|R|]J|
sql = "insert into user (id,name) values (?,?)"; 3@5p"X
PreparedStatement ps = cn.prepareStatement(sql); j%& IL0
ps.setInt(1,xxx); V`fL%du,3
ps.setString(2,xxx); 5)+F(
... 0H=9@
ResultSet rs = ps.executeQuery(); // 查询 'I/h(
int c = ps.executeUpdate(); // 更新 hSqMaX%G
2HOe__Ns
3、处理执行结果 M?o{STt
查询语句,返回记录集ResultSet FMu!z
更新语句,返回数字,表示该更新影响的记录数 ;Gm>O7"|@
ResultSet的方法 r(uP!n1+
1、next(),将游标往后移动一行,如果成功返回true;否则返回false `?o=*OS7Y
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 H`<?<ak6'M
73DlRt
*
4、释放连接 E`p'L!z
cn.close(); f =_^>>.
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection _|n=cC4Qu
U6WG?$x
可滚动、更新的记录集 rS~qi}4X
1、创建可滚动、更新的Statement vC9@,[
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Q5E:|)G
该Statement取得的ResultSet就是可滚动的
<jd/t19DB
2、创建PreparedStatement时指定参数 hWGZd~L
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); gOE_
]
ResultSet.absolute(9000); w@N{@tG
批量更新 R "E<8w
1、Statement F+j O*F2h
Statement sm = cn.createStatement(); fuSq ={]
sm.addBatch(sql1); /GsrGX8
sm.addBatch(sql2); ;9rTE|n
... lL2-.!]R
sm.executeBatch() l]vohLz
3!
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 fykI,!
2、PreparedStatement tSw>@FM
PreparedStatement ps = cn.preparedStatement(sql); G.VYp6)5
{ rycJyiw<-
ps.setXXX(1,xxx); &X w`T9<
... %F$N#YG
ps.addBatch(); J%r7<y\
} d)*(KhYie@
ps.executeBatch(); _'*DT=H'U
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 wr@GN8e`
b:x7)$(
事务的处理 }|He?[TR
1、关闭Connection的自动提交 ib50LCm
cn.setAutoCommit(false); A#:8X1w
2、执行一系列sql语句 5fq.*1f
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close cqg=8$ RB
Statement sm ; {(HxG4~
sm = cn.createStatement(insert into user...); `Yogq)G}
sm.executeUpdate(); -c$z 2Q)
sm.close(); 92(~'5Qr
sm = cn.createStatement("insert into corp...); FrR9{YTA.
sm.executeUpdate(); j7sU0"7^
sm.close(); OPJgIU%
3、提交 S_T
cn.commit(); kbq:U8+k
4、如果发生异常,那么回滚 _SF!T6A
cn.rollback();