java 数据库基本操作 UX`DZb+^
1、java数据库操作基本流程 ]}7rWs[|1
2、几个常用的重要技巧: 1bZiPG{
可滚动、更新的记录集 |cGeL[
批量更新 #S%Y;ilq
事务处理 vj&5`
4t
Nv q
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 h+~df(S.
1、取得数据库连接 _G[I2]
1)用DriverManager取数据库连接 *;e@t4
例子 ;c-
]bhBB
String className,url,uid,pwd; 2{B(j&{
className = "oracle.jdbc.driver.OracleDriver"; ]p&< nK,
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; xY'qm8V
uid = "system"; Vt=(2d5:p
pwd = "manager"; >2CusT 2
Class.forName(className); uy _i{Y|
Connection cn = DriverManager.getConnection(url,uid,pwd); &s^>S?L-
2)用jndi(java的命名和目录服务)方式 Ogke*qM
例子 %y\eBfW,/
String jndi = "jdbc/db"; RC{Z)M{~
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); aXbNDj
][
DataSource ds = (DataSource) ctx.lookup(jndi); B UQn+;be
Connection cn = ds.getConnection(); D5!K<G?-K
多用于jsp中 %7>AcTN~
2、执行sql语句 3V
Mh)
1)用Statement来执行sql语句 CQjZAv
String sql; 4m~7 ~- h
Statement sm = cn.createStatement(); Y3$PQwn
.P
sm.executeQuery(sql); // 执行数据查询语句(select) 25a#eDbqi
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); PIEW \i
2)用PreparedStatement来执行sql语句 rW~?0
String sql; sh(kRrdY3
sql = "insert into user (id,name) values (?,?)"; *rn]/w8ZW
PreparedStatement ps = cn.prepareStatement(sql);
}d~wDg<#
ps.setInt(1,xxx); '"w}gx
ps.setString(2,xxx); c@9Z&2)
... x , Vh
ResultSet rs = ps.executeQuery(); // 查询 4Wla&yy
int c = ps.executeUpdate(); // 更新 1Y"35)CR)
=Esbeb7P
3、处理执行结果 nl'J.dJe
查询语句,返回记录集ResultSet yMbcFDlBr
更新语句,返回数字,表示该更新影响的记录数 <Hh5u~
ResultSet的方法 ;4kx >x*H
1、next(),将游标往后移动一行,如果成功返回true;否则返回false te;Ox!B&
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 @0ov!9]Rw-
oB0 8
4、释放连接 ] `B,L*m6
cn.close(); N$%61GiulT
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection >{ECyh;
&7($kj
可滚动、更新的记录集 r2SJp@f
1、创建可滚动、更新的Statement uGa(_ut
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 'l'
X^LMD
该Statement取得的ResultSet就是可滚动的 0n*rs=\VG
2、创建PreparedStatement时指定参数 VZ2.w4b
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Bzu(XQ
ResultSet.absolute(9000); /1 US,
批量更新 pymx\Hd,
1、Statement ?..i 4
Statement sm = cn.createStatement(); ]PlY}VOY
sm.addBatch(sql1); E#<7\p>
sm.addBatch(sql2); EvqUNnjR
... 18.Y/nZAgQ
sm.executeBatch() f^!11/Wv
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Yz2{LW[K
2、PreparedStatement BZJKiiD
PreparedStatement ps = cn.preparedStatement(sql); C!7U<rI
{ @1<omsl
ps.setXXX(1,xxx); #.)xm(Ys
... ]{|fYt_-
ps.addBatch(); "u<jbD
} /[Bl
ps.executeBatch(); }%!FMXe
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Lf^5Eo/
5A
(Bt;DM#>
事务的处理 .'5'0lR5
1、关闭Connection的自动提交 8Wdkztp/S
cn.setAutoCommit(false); ~VqFZasV
2、执行一系列sql语句 yX7CN5vVl
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close }c`
?0FQ
Statement sm ; *MYt:ms
sm = cn.createStatement(insert into user...); J4gI=@e
sm.executeUpdate(); 7.Ml9{M/i
sm.close(); pXPqDA
sm = cn.createStatement("insert into corp...); 5jn$7iE`
sm.executeUpdate(); j`2B}@ 2
sm.close(); M'cJ)-G
3、提交 <#xrrRhm}
cn.commit(); R=\v3m
4、如果发生异常,那么回滚 ]`zjRRd
cn.rollback();