java 数据库基本操作 -3` "E%9
1、java数据库操作基本流程 U_l7CCK +
2、几个常用的重要技巧: 4#_$@ r
可滚动、更新的记录集 R5~gH6K|
批量更新 '#A:.P
事务处理 Xk?R mU6
e{0L%%2K
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 x~EKGoz3
1、取得数据库连接 Rjq a_hxrS
1)用DriverManager取数据库连接 %J _ymJ'pd
例子 i|S:s
String className,url,uid,pwd; p0Gk j-
className = "oracle.jdbc.driver.OracleDriver"; +RS$5NLH
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; F?cq'd
uid = "system"; 5/ * >v
pwd = "manager"; VRF6g|0;
Class.forName(className); t7bqk!6hM\
Connection cn = DriverManager.getConnection(url,uid,pwd); SRItE\"Xe
2)用jndi(java的命名和目录服务)方式 ei|cD[
NY
例子 rGQ5l1</
String jndi = "jdbc/db"; MxTmWsaW
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ]-:1se
DataSource ds = (DataSource) ctx.lookup(jndi); 781]THY=
Connection cn = ds.getConnection(); vOe0}cR
多用于jsp中 1Cv#nhmp
2、执行sql语句 84^[/d;!
1)用Statement来执行sql语句 E M Q4yK
String sql; dMV=jJ%Y
Statement sm = cn.createStatement(); bK4&=#Zh
sm.executeQuery(sql); // 执行数据查询语句(select) x,\!DLq:p
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); R*bmu
2)用PreparedStatement来执行sql语句 B)6#Lp3
String sql; t.)AggXj#
sql = "insert into user (id,name) values (?,?)"; 3fp> 4;ym'
PreparedStatement ps = cn.prepareStatement(sql); m2 O&2[g
ps.setInt(1,xxx); UOt8Q0)}
ps.setString(2,xxx); '_0
... krjN7&
ResultSet rs = ps.executeQuery(); // 查询 @1g&Z}L
o
int c = ps.executeUpdate(); // 更新 SO3cY#i
z"
+xp*]a
3、处理执行结果 _B[WY
查询语句,返回记录集ResultSet .,M;huRg
更新语句,返回数字,表示该更新影响的记录数 L M
/Ga
ResultSet的方法
Jq)U</
1、next(),将游标往后移动一行,如果成功返回true;否则返回false /H)Br~ l
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 {cR=N~_EO
Rh<N);Sl7
4、释放连接 +c) TDH
cn.close(); #9:2s$O[x
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection bi$VAYn.^
mxp Y&Y
可滚动、更新的记录集 yFjVKp'P
1、创建可滚动、更新的Statement |dk[cX>
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 8W -@N
该Statement取得的ResultSet就是可滚动的 1
i3k
2、创建PreparedStatement时指定参数 M{E{N K
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 6D/tK|
ResultSet.absolute(9000); x8\<qh*:
批量更新 h e&V# #
1、Statement 8+&JQ"UaB
Statement sm = cn.createStatement(); Hb!6ZEmN%
sm.addBatch(sql1); 8TPN#"
sm.addBatch(sql2); 3=-
})X;
... !re1EL
sm.executeBatch() `!i-#~n
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 [/$N!2'5
2、PreparedStatement
RJ}#)cT
PreparedStatement ps = cn.preparedStatement(sql); X;!~<~@Y
{ bfdVED
ps.setXXX(1,xxx); p/*"4-S
... _a5(s2wq+
ps.addBatch(); ,2,5Odrz
} mCdgKr|n
ps.executeBatch(); e&1\'Zq?>
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Mu2`ODe]
OCK>%o$[
事务的处理 pM2a(\K,k^
1、关闭Connection的自动提交
zF: j
cn.setAutoCommit(false); Uu'dv#4Iw
2、执行一系列sql语句 $Q/Ya@o
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close -5k2j^r;
Statement sm ; #SnvV
sm = cn.createStatement(insert into user...); Uf$i3
sm.executeUpdate(); Hg+
F^2<y
sm.close(); 2f,2rW^i
sm = cn.createStatement("insert into corp...); %Q~CB7ILK
sm.executeUpdate(); jO8k6<l
sm.close(); .=<$S#x^Hb
3、提交 E FY@Y[
cn.commit(); o8ppMM8_R[
4、如果发生异常,那么回滚 XUSvhr$|
cn.rollback();