java 数据库基本操作 slEsSR'J]
1、java数据库操作基本流程 "Hmo`E B0
2、几个常用的重要技巧: E[J7FgU)<S
可滚动、更新的记录集 br"p D-}
批量更新 hu-fwBK
事务处理 da3]#%i0
dOq*W<%
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 CTt3W>'=+
1、取得数据库连接 ZD1UMB0$4
1)用DriverManager取数据库连接 y &\ J
例子 KIdlndGs
String className,url,uid,pwd; rr2'bf<]
className = "oracle.jdbc.driver.OracleDriver"; "4LYqDe
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 4J2NIFZ
uid = "system"; GLA,,i'i9
pwd = "manager"; g% :Q86u
Class.forName(className); HoGrvt<:.P
Connection cn = DriverManager.getConnection(url,uid,pwd); De[!^/f;T
2)用jndi(java的命名和目录服务)方式 A>^\jIB>
例子 6a PZW
String jndi = "jdbc/db"; Q"CZ}B1<
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); _s!(9
DataSource ds = (DataSource) ctx.lookup(jndi); KYVB=14
Connection cn = ds.getConnection(); `9eE139V='
多用于jsp中 |sHIT<=m
2、执行sql语句 IuTZ2~
1)用Statement来执行sql语句 j& f-yc'i-
String sql; a3
wUB
Statement sm = cn.createStatement(); l%lkDh!$"
sm.executeQuery(sql); // 执行数据查询语句(select) -yOrNir}W
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Os9xZ
2)用PreparedStatement来执行sql语句 noa?p&Y1m
String sql; UDV,c o
sql = "insert into user (id,name) values (?,?)"; di`Ql._M
PreparedStatement ps = cn.prepareStatement(sql); lu_ y 9o^
ps.setInt(1,xxx); ]7v-qd
ps.setString(2,xxx); R_.C,mR ?
... URmx8=q
ResultSet rs = ps.executeQuery(); // 查询 qX`?4"4
int c = ps.executeUpdate(); // 更新 E=GCq=Uw
|4pE"6A
3、处理执行结果 |vA3+kG
查询语句,返回记录集ResultSet or\
2)
更新语句,返回数字,表示该更新影响的记录数 A/%K= H?
ResultSet的方法 ow]S 3[07
1、next(),将游标往后移动一行,如果成功返回true;否则返回false #
SV*6
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 S #%'Vrp
U/Z!c\r
4、释放连接 R>BI;IcX
cn.close(); PX52a[wNDH
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection [3;J,P=&
`4}zB#3
可滚动、更新的记录集 J6_Hlt
1、创建可滚动、更新的Statement UL$^zR3%d
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); beEdH>
该Statement取得的ResultSet就是可滚动的 8Z:NT_Ss
2、创建PreparedStatement时指定参数 {_|~G|Z
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
Pe!uk4}w
ResultSet.absolute(9000); {-J/
<a@
批量更新 T/MbEqAf
1、Statement 'wvZnb
Statement sm = cn.createStatement(); k# ZO4
sm.addBatch(sql1); ='T<jV`evu
sm.addBatch(sql2); oat*ORL
... jL^zS XQB
sm.executeBatch() tx}{E<\>$
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 k4'rDJfB
2、PreparedStatement o~<37J3).
PreparedStatement ps = cn.preparedStatement(sql); GfD!Z3
{ ?o$6w(]''
ps.setXXX(1,xxx); U:~O^
...
r75,mX
ps.addBatch(); Ex^7`-2,B
} ?%i|].<-'
ps.executeBatch(); ^;$a_eR
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 |L.QIr,jCC
bk}.^m!
事务的处理 3%|LMX]M5_
1、关闭Connection的自动提交 2Prr:k
cn.setAutoCommit(false); Ra&HzK?
2、执行一系列sql语句 LtJ$ZE^GB
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close J1YP-:
Statement sm ; zK(9k0+s
sm = cn.createStatement(insert into user...); }?$d~]t)
sm.executeUpdate(); K:c5Yq^
sm.close(); 9(QY~F
sm = cn.createStatement("insert into corp...); 0rxlN
[Yp
sm.executeUpdate(); ha1 J^e
sm.close(); =PP]LDlJs
3、提交 q62TYg}
cn.commit(); ^j[>.D
4、如果发生异常,那么回滚 y;keOI!
cn.rollback();