java 数据库基本操作 j
l}!T[5
1、java数据库操作基本流程 f2`P8$U)R
2、几个常用的重要技巧: a|8|@,
可滚动、更新的记录集 ,LoMt ]H
批量更新 &b5T&-C<
事务处理 vYYS.ve
dK[*
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ?s1u#'aO
1、取得数据库连接 s*aH`M7^0
1)用DriverManager取数据库连接 +Gk!
t]dy
例子 '2wXV;`
String className,url,uid,pwd; ,Le&I9*%
className = "oracle.jdbc.driver.OracleDriver"; Y;'VosTD
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; F_ ,L2J
uid = "system"; (Nm}3 p
pwd = "manager"; t|go5DXz4
Class.forName(className); tniPEmeS
Connection cn = DriverManager.getConnection(url,uid,pwd); 8f /T!5
2)用jndi(java的命名和目录服务)方式 av'd%LZP
例子 dDsjPM;2
String jndi = "jdbc/db"; mrK,Ql
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); -q'xC: m
DataSource ds = (DataSource) ctx.lookup(jndi); x:!C(Ep)
Connection cn = ds.getConnection(); SPfD2%jjC
多用于jsp中 Uzan7A
2、执行sql语句 /'R UA
1)用Statement来执行sql语句 muL>g_H
String sql; LvSP #$f
Statement sm = cn.createStatement(); z\xiACIc
sm.executeQuery(sql); // 执行数据查询语句(select) D?iy.Dg
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); b*btkaVue
2)用PreparedStatement来执行sql语句 2N
L:\%wz
String sql; >{phyByI
sql = "insert into user (id,name) values (?,?)"; 6T R8D\
PreparedStatement ps = cn.prepareStatement(sql); l,imT$u
ps.setInt(1,xxx); +io;K]C
ps.setString(2,xxx);
YRg=yVo2
... V}vl2o
ResultSet rs = ps.executeQuery(); // 查询 k7:GS,7
int c = ps.executeUpdate(); // 更新 `E./p
FBR$,j;Y
3、处理执行结果 1<XiD3H;
查询语句,返回记录集ResultSet kA7~Yu5|
更新语句,返回数字,表示该更新影响的记录数 c%q}"Y0oh
ResultSet的方法 J0IdFFZ|w
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ;FV~q{
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 !L&=?CX
t!J";l
4、释放连接 Uq9,(tV`6g
cn.close(); wQF&GGYR
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection <7vI h0
",MK'\E
可滚动、更新的记录集 aX>4Tw
1、创建可滚动、更新的Statement ?)A]q'
O
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); x:f|3"\s
该Statement取得的ResultSet就是可滚动的 4@/ q_*3o
2、创建PreparedStatement时指定参数
H B::0l<
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); sDzD
8as
ResultSet.absolute(9000); W _PM!>8`
批量更新 _9}x2uO~
1、Statement m NUN6qVP~
Statement sm = cn.createStatement(); LU-#=1Q
sm.addBatch(sql1); k7z(Gbzu
sm.addBatch(sql2); lU&`r:1>_
... "@c';".|
sm.executeBatch() gt2>nTJz.Z
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 eEZ|nEU
2、PreparedStatement K B`1% =
PreparedStatement ps = cn.preparedStatement(sql); (&9DB
{ #U",,*2
ps.setXXX(1,xxx); "sX[p
... +t7c&td\
ps.addBatch(); n.Ur-ot
} %0ll4"
ps.executeBatch(); eZ8Y"i\!y
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 {f@xA
J9b?}-O)
事务的处理 Z-? Iip{
1、关闭Connection的自动提交 o*O"\/pmF
cn.setAutoCommit(false); OH-~
2、执行一系列sql语句 R`I8Ud4=
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 6nY
)D6$JG
Statement sm ; &J5-'{U|0
sm = cn.createStatement(insert into user...); u7WTSL%
sm.executeUpdate(); HKEop
sm.close(); 9a"Y,1
sm = cn.createStatement("insert into corp...); SU_]C+
sm.executeUpdate(); [T}%q"<
sm.close(); %#S "~)
3、提交 r|JiGj^om
cn.commit(); g|GvJ)VX
4、如果发生异常,那么回滚 + e5
cn.rollback();