java 数据库基本操作 B(k tIy
1、java数据库操作基本流程
Hf\sF(, (
2、几个常用的重要技巧: 0^sY>N"
可滚动、更新的记录集 +@~WKa
批量更新 aU^6FI
事务处理 b?c/J{me
6uT*Fg-G
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 *mbzK*
1、取得数据库连接 /R&h#;l
1)用DriverManager取数据库连接 O1S7t)ag
例子 CH&{x7$he
String className,url,uid,pwd; o+7)cI
className = "oracle.jdbc.driver.OracleDriver"; -*z7`]5J
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Jv+w{"&
uid = "system"; Fxc_s/^=t
pwd = "manager"; O^j*"#f
Class.forName(className); OF+4Mq
Connection cn = DriverManager.getConnection(url,uid,pwd); n\3#69VY
2)用jndi(java的命名和目录服务)方式 P^Owgr=Y
例子 ;81,1
Ie<~
String jndi = "jdbc/db"; q\~
#g.}
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); -z0;4O (K]
DataSource ds = (DataSource) ctx.lookup(jndi); iER@_?
Connection cn = ds.getConnection(); tH44\~
多用于jsp中 ]%FAJ\
2、执行sql语句 a4*976~![
1)用Statement来执行sql语句 f:ObI
String sql; /s}
"0/Y\
Statement sm = cn.createStatement(); f&mi nBU
sm.executeQuery(sql); // 执行数据查询语句(select) 1P*hC<
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); kDMvTVd
2)用PreparedStatement来执行sql语句
S#?2E8
String sql; ninWnQq
sql = "insert into user (id,name) values (?,?)"; &i(Ip'r
PreparedStatement ps = cn.prepareStatement(sql); KE@+I.x
ps.setInt(1,xxx); ]B?M3`'>
ps.setString(2,xxx); Hd\V?#H
... V`1{*PrI@L
ResultSet rs = ps.executeQuery(); // 查询 U/^#nU.,
int c = ps.executeUpdate(); // 更新 6]Is"3ca
^n(FO,8c
3、处理执行结果 &UOxS W
查询语句,返回记录集ResultSet 0B7G:X0
更新语句,返回数字,表示该更新影响的记录数 d]`6N
ResultSet的方法 .JXEw%I@
1、next(),将游标往后移动一行,如果成功返回true;否则返回false jr? /wtw
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 HFZ'xp|3dn
9`*Eeb>
4、释放连接 H8FvI"J
cn.close(); w9G|)UDib
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ekL;SN
wlJi_)!
可滚动、更新的记录集
}o*A>le
1、创建可滚动、更新的Statement )q-NE)
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Syy{ ^Ae}
该Statement取得的ResultSet就是可滚动的 rZJJ\ , |
2、创建PreparedStatement时指定参数 j2<+[h-
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ~TEn +
ResultSet.absolute(9000); .R)P
|@z L
批量更新 uC^)#Y\"
1、Statement \&hq$
Statement sm = cn.createStatement(); z3K$gEve
sm.addBatch(sql1); 3NLn}
sm.addBatch(sql2); i[IFD]Xy!j
... Lo{wTYt:J
sm.executeBatch()
,"(G
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 )>:~XA|?
2、PreparedStatement A}(]J!rc
PreparedStatement ps = cn.preparedStatement(sql);
pE)NSZ
{ Ee2P]4_d
ps.setXXX(1,xxx); "u!gfG?oH
... 2c 0;P
#ol
ps.addBatch(); 5MaN
{*)l
} V;xPZ2C;
ps.executeBatch(); J
W@6m
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Wvf>5g)?
gZ$
8Y7
事务的处理 E6TeZ%g
1、关闭Connection的自动提交 5 ix*wu`,
cn.setAutoCommit(false); !q\=e@j-i
2、执行一系列sql语句 S
F*C'
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close p{^:b6
Statement sm ; 4 k<o
sm = cn.createStatement(insert into user...); ]yf?i350
sm.executeUpdate(); kk-<+R2
sm.close(); RTcxZ/\"#
sm = cn.createStatement("insert into corp...); dDpAS#'s\
sm.executeUpdate(); wWb>V&3
sm.close(); a+cMXMf
3、提交 .cHgYHa
cn.commit(); k
i<X ^^
4、如果发生异常,那么回滚 9f( X7kt
cn.rollback();