java 数据库基本操作 _s[ohMlh
1、java数据库操作基本流程 'P0:1">
2、几个常用的重要技巧: `WboM\u
可滚动、更新的记录集 Rp^kD ,*
批量更新 h#dp_#
事务处理 ]o$aGrZ
}Y[xj{2$O
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 TTZb.
1、取得数据库连接 C*a>B,H
1)用DriverManager取数据库连接 ]u?|3y^(
例子 v,I4ozDx
String className,url,uid,pwd; ve49m%NQ
className = "oracle.jdbc.driver.OracleDriver"; bJ4} )P&
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; E z?O
gE{
uid = "system"; Iq]+O Q
pwd = "manager"; 3+ %a
Class.forName(className); 4@AY~"dq
Connection cn = DriverManager.getConnection(url,uid,pwd); 0Dv r:]R
2)用jndi(java的命名和目录服务)方式 dY5 m) ?
例子 uZL,+Ce|
String jndi = "jdbc/db"; f~%|Iu1ob
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); w[YiH $
DataSource ds = (DataSource) ctx.lookup(jndi); iH<:wLY&J
Connection cn = ds.getConnection(); J&CA#Bg:w
多用于jsp中 }`ox;Q
2、执行sql语句 Z@2^> eC
1)用Statement来执行sql语句 Xia4I*
*
String sql; R.@ I}>
Statement sm = cn.createStatement(); Lp.dF)C\
sm.executeQuery(sql); // 执行数据查询语句(select) "Rr)1x7
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Gf_Je
2)用PreparedStatement来执行sql语句 ?41bZ$j
String sql; #Z#rOh
sql = "insert into user (id,name) values (?,?)"; eS-akx^@
PreparedStatement ps = cn.prepareStatement(sql); X
[IVK~D}z
ps.setInt(1,xxx); />Kd w
ps.setString(2,xxx); 6hp>w{+
... \5M1;
ResultSet rs = ps.executeQuery(); // 查询 Q=9Ce@[
int c = ps.executeUpdate(); // 更新 fUx;_GX?
6|:K1bI)
3、处理执行结果 #J~
查询语句,返回记录集ResultSet bWWZGl9
更新语句,返回数字,表示该更新影响的记录数 O$zXDxn
ResultSet的方法 QiC}hj$
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ]s_,;PG U
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 iga.B
bca4'`3\|
4、释放连接 $$F iCMI
cn.close(); e0;0 X7
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection i]x_W@h
;O8'vp
可滚动、更新的记录集 O/Cwm;&t
1、创建可滚动、更新的Statement f$1&)1W[
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Yw=7(}
该Statement取得的ResultSet就是可滚动的 c||EXFS}O
2、创建PreparedStatement时指定参数 XX&4OV,^%D
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); {6Y |Z>
ResultSet.absolute(9000); V3D`pt\[x
批量更新 u+EZ"p;o
1、Statement RGEgYOO
Statement sm = cn.createStatement(); 7}#zF]vHNi
sm.addBatch(sql1); B^Sxp=~Au
sm.addBatch(sql2); \.ukZqB3
0
... f|f)Kys%5
sm.executeBatch() W% @r
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 eF-U
1ZJT
2、PreparedStatement gZq_BY_U
PreparedStatement ps = cn.preparedStatement(sql); h'lqj0
{ |2ImitN0
ps.setXXX(1,xxx); tVQq,_9C
... jRiXN%
ps.addBatch(); N_wj,yF*
} 8=!uQQ
ps.executeBatch(); HOt,G
_{
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Gb!R>WY
8ShIn@|32
事务的处理 W {A4*{
1、关闭Connection的自动提交 J4?i\wD:
cn.setAutoCommit(false); Mh"X9-Ot
2、执行一系列sql语句 \!LIqqX
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close /U26IbJ
Statement sm ; )iX2r{
sm = cn.createStatement(insert into user...); U}T{r%9
sm.executeUpdate(); moS0y?N
sm.close(); z@I'Ryalyc
sm = cn.createStatement("insert into corp...); tNoPpIu
sm.executeUpdate(); jYUN:
sm.close(); L:j3
3、提交 ?7=c`
cn.commit(); 4SVIdSA
4、如果发生异常,那么回滚 j%+>y;).
cn.rollback();