java 数据库基本操作 6y"T;.FAo
1、java数据库操作基本流程 FtDF}
2、几个常用的重要技巧: J0o,ZH9
可滚动、更新的记录集 ,L-V?B(UQ
批量更新 QT|\TplJt
事务处理 hZ')<@hNP
PO|gM8E1x?
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 M<SV H_
1、取得数据库连接 xS=" o
1)用DriverManager取数据库连接 c_aj-`BKp
例子 u)%/df qzZ
String className,url,uid,pwd; NL'(/|)
className = "oracle.jdbc.driver.OracleDriver"; _T;Kn'Gz(&
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; }*vE/W
uid = "system"; AXv-%k};
pwd = "manager"; @ *5+ZAF
Class.forName(className); aPX'CG4m
Connection cn = DriverManager.getConnection(url,uid,pwd); D}N4*L1
2)用jndi(java的命名和目录服务)方式 `X B$t?xi
例子 |;"(C# B
String jndi = "jdbc/db";
E/gfX
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); z+^9)wg9
DataSource ds = (DataSource) ctx.lookup(jndi); Ci2*5n<
Connection cn = ds.getConnection(); #E#@6ZomT
多用于jsp中 &3itBQF
2、执行sql语句 a%QgL&_5
1)用Statement来执行sql语句 Bp4#"y2
String sql; }{[JS=A^
Statement sm = cn.createStatement(); R''2o_F6
sm.executeQuery(sql); // 执行数据查询语句(select) T iJ \J{
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 'CRjd~L
2)用PreparedStatement来执行sql语句 Un&rP70
String sql; DW)X3A(^
sql = "insert into user (id,name) values (?,?)"; o?aF
PreparedStatement ps = cn.prepareStatement(sql); V5 Gy|X
ps.setInt(1,xxx); ![eipOX
ps.setString(2,xxx); 7'ws: #pC
... th5UzpB4
ResultSet rs = ps.executeQuery(); // 查询 l(}l([rdQ
int c = ps.executeUpdate(); // 更新 -WGlOpg0;
?iL-2I3*
3、处理执行结果 $MM[`^~
查询语句,返回记录集ResultSet :]LW,Eql
更新语句,返回数字,表示该更新影响的记录数 Ij9=J1c4
ResultSet的方法 <1`MjP*w
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 'Hu+8,xA
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 r>rL[`p(2
zv^+8h7k
4、释放连接 'G`xD3 E3,
cn.close(); 6}*4co
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection W~s:SN
^C}f|{J
可滚动、更新的记录集 `*i:z'
1、创建可滚动、更新的Statement ghk"XJ|
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); y-Lm^GW4
该Statement取得的ResultSet就是可滚动的 I}awembw g
2、创建PreparedStatement时指定参数 oMNBK/X_
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); "J`#
ResultSet.absolute(9000);
af/0e}-
批量更新 dd4^4X`j
1、Statement q~{O^,4S
Statement sm = cn.createStatement(); EV;"]lC9
sm.addBatch(sql1); 9|K:\!7
sm.addBatch(sql2); 4UN|`'c
... uTy00`1
sm.executeBatch() d-I=xpB
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 +Edq4QYwR
2、PreparedStatement [5GzY`/m
PreparedStatement ps = cn.preparedStatement(sql); ?` 2z8uD/
{ G420o}q
ps.setXXX(1,xxx); V)ITk\
... SN$3cg]z
ps.addBatch(); ]@l;;Sp
} 2=|Ks]<P
ps.executeBatch(); )1<GSr9
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 1([?EfC
Io('kCOR;
事务的处理 #5X+.!L
1、关闭Connection的自动提交 HrRw
cn.setAutoCommit(false); 31p7oRzr
2、执行一系列sql语句 T|5uywA|
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close p`'3Il3
Statement sm ; <JW%h :\t
sm = cn.createStatement(insert into user...); k?Njge6@
sm.executeUpdate(); R-Y 7I
sm.close(); *(sv5c!0M8
sm = cn.createStatement("insert into corp...); "}0)~,{xB
sm.executeUpdate(); D% 2S!
sm.close(); !{A#\~,
3、提交 9CZEP0i7
cn.commit(); rt\.|Hr4s
4、如果发生异常,那么回滚 o3le[6C/8=
cn.rollback();