java 数据库基本操作 ?`oCc[hY
1、java数据库操作基本流程 -H%806NAX7
2、几个常用的重要技巧: yn[^!GuJ_
可滚动、更新的记录集 'b*
yYX<
批量更新 <R.5Ma
事务处理 N:y3tpG
6BJPQdqSl
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 v_gQCS
1、取得数据库连接 ZMHb
1)用DriverManager取数据库连接 U[a;eOLx
例子 GCUzKf&
String className,url,uid,pwd; _:,:U[@Vz
className = "oracle.jdbc.driver.OracleDriver"; l(T CF
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; )bqfj>%#c
uid = "system"; /Wh}
;YTv^
pwd = "manager"; }D7q)_g=
Class.forName(className); L{)e1 p]q
Connection cn = DriverManager.getConnection(url,uid,pwd); !6pOY*> j
2)用jndi(java的命名和目录服务)方式 GB(o)I#h
例子 Ua^'KRSO
String jndi = "jdbc/db"; wnL\.%Y^
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 0wLu*K5$4E
DataSource ds = (DataSource) ctx.lookup(jndi); 24)3^1P\V
Connection cn = ds.getConnection(); D! 1oYr
多用于jsp中 E0<9NFQr7
2、执行sql语句 aMSX"N"ot
1)用Statement来执行sql语句 A3p@hQl
String sql; -$E_L:M
Statement sm = cn.createStatement(); l)glT]G3+
sm.executeQuery(sql); // 执行数据查询语句(select) t]~Lo3
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); `5[d9z/ 6
2)用PreparedStatement来执行sql语句 HXTBxh
String sql; (Id]'w4
sql = "insert into user (id,name) values (?,?)"; af61!?K
PreparedStatement ps = cn.prepareStatement(sql); ey@]B5
ps.setInt(1,xxx); DHO6&8S
ps.setString(2,xxx); 9=j"kXFf
... ZkW,
ResultSet rs = ps.executeQuery(); // 查询 a{7>7%[
int c = ps.executeUpdate(); // 更新 sS,Swgr
[<Wo7G1s
3、处理执行结果 lCDu,r;\
查询语句,返回记录集ResultSet 2Y)3Ue
更新语句,返回数字,表示该更新影响的记录数 *7Ct#GC
ResultSet的方法 +s:!\(BM
1、next(),将游标往后移动一行,如果成功返回true;否则返回false -v4kW0G
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 a
W`q
h&+dIk\[3
4、释放连接 Ji_3*(
cn.close(); 92F(Sl
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection WHQg6r
+ RX{
可滚动、更新的记录集 8F(lW)A n
1、创建可滚动、更新的Statement ,BCtNt(
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); F$UvYy4O d
该Statement取得的ResultSet就是可滚动的
y#5xS
2、创建PreparedStatement时指定参数 #Mt'y8|}$
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ugEh}3
ResultSet.absolute(9000); bwG2=
批量更新 ^[noGjy
1、Statement 1D03Nbh|5
Statement sm = cn.createStatement(); \`\& G-\
sm.addBatch(sql1); +_tK \MN
sm.addBatch(sql2); .eAN`-t;
... |1zoT|}q
sm.executeBatch() G[1:<Vg8
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 sr+*
q6W
2、PreparedStatement Q#
w`ZQX3
PreparedStatement ps = cn.preparedStatement(sql); \WG6\Zg0A
{ |*5K fxq
ps.setXXX(1,xxx); ?(el6 J}
... hPa:>e
ps.addBatch(); ^uIP
} &13qlc6
ps.executeBatch(); k{<]J5{7
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 'c3P3`o,;
UI}v{05]
事务的处理 -y70-K3
1、关闭Connection的自动提交 Z,%^BAJ
cn.setAutoCommit(false); aA?Uf~ "t
2、执行一系列sql语句 &FF%VUfQJ
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 96UL](l(`
Statement sm ; I@a y&NNh
sm = cn.createStatement(insert into user...); .5*h']iFr1
sm.executeUpdate(); =*7K_M&
sm.close(); {<{
O!
sm = cn.createStatement("insert into corp...); +:3K?G-
sm.executeUpdate(); ct+ ;W
sm.close(); t{#Btd
3、提交 FS7 _ldD
cn.commit(); >J+'hm@
4、如果发生异常,那么回滚 cRPW
cn.rollback();