java 数据库基本操作 nlc.u}#
1、java数据库操作基本流程 ]s_8A`vm
2、几个常用的重要技巧: 3@<zg1.9-
可滚动、更新的记录集 5l{Ts04k%
批量更新 Z[?mc|*x
事务处理 eE(b4RCM
FwG!>
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 t;NV $!!
1、取得数据库连接 w7TJv4_
1)用DriverManager取数据库连接 FX}Gt=
例子 B^v8,;jZT
String className,url,uid,pwd; /=: j9FF
className = "oracle.jdbc.driver.OracleDriver"; ]a'99^?\
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; "ju'UOcS/
uid = "system"; R2<s0l
pwd = "manager"; "i^
GmVn
Class.forName(className); EGVM)ur
Connection cn = DriverManager.getConnection(url,uid,pwd); g>JLDQdc
2)用jndi(java的命名和目录服务)方式 :-T*gqj|
例子 @N@F,~[RR2
String jndi = "jdbc/db"; ;C.S3}
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 0#_'o ,
DataSource ds = (DataSource) ctx.lookup(jndi); #5} wuj%5
Connection cn = ds.getConnection(); EgjR^A1W2
多用于jsp中 O+q/4
2、执行sql语句 }H> ^o9
1)用Statement来执行sql语句 !69&Ld
String sql; aB~S?.l
Statement sm = cn.createStatement(); Yf@e=:
sm.executeQuery(sql); // 执行数据查询语句(select) X{xBYZv4
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 2,q}Nq
2)用PreparedStatement来执行sql语句 $'rG-g!f\
String sql; Z @ dC+0[=
sql = "insert into user (id,name) values (?,?)"; dt@P>rel
PreparedStatement ps = cn.prepareStatement(sql); ^TY;Zp
ps.setInt(1,xxx); v=@TWEE
ps.setString(2,xxx); nI.x
... W !w, f;
ResultSet rs = ps.executeQuery(); // 查询 l7H
qo)
int c = ps.executeUpdate(); // 更新 Z<[<n0o1
#DU26nCL
3、处理执行结果 B%CTOi
查询语句,返回记录集ResultSet H,3\0BKk
更新语句,返回数字,表示该更新影响的记录数 d\{>TdyF
ResultSet的方法
afBE{
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ^&@w$
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ygJr=_iA9
#'D"
'B
4、释放连接 ULrr=5&8
cn.close(); !G^L/?z3
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection #6Fez`A
h,aA w#NE*
可滚动、更新的记录集 KqBk~-G
1、创建可滚动、更新的Statement >(uZtYM\j
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 00v&lQBW
该Statement取得的ResultSet就是可滚动的 f`9
b*wV
2、创建PreparedStatement时指定参数 x-OA([;/
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); $vC1 K5sLk
ResultSet.absolute(9000); +/,icA}PI
批量更新 kpL@P oQ/r
1、Statement EVp,Q"V]
Statement sm = cn.createStatement(); 7S/G
B
sm.addBatch(sql1); Ya>oCr}K
sm.addBatch(sql2); jK \T|vGJa
... (py]LBZ
sm.executeBatch() 5`
Te\H
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 <N\v)Ug`
2、PreparedStatement $o$
maA0
PreparedStatement ps = cn.preparedStatement(sql); mPI8_5V8]
{ _ZY)M
ps.setXXX(1,xxx); u[nyW3MZ
... (WJ${OW
ps.addBatch(); 3a.kBzus
} ;"(foY"L
ps.executeBatch(); !Mi;*ZR
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 T] 2q?;N
6-?66gmT
事务的处理 3nZo{p:E
1、关闭Connection的自动提交 D8
hr?:I9
cn.setAutoCommit(false); N<QXmgqx
2、执行一系列sql语句 8_T6_jL<
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ()~pY!)1/
Statement sm ; N[k wO1
sm = cn.createStatement(insert into user...); 0eK*9S]
sm.executeUpdate(); ByCnD
sm.close(); =[F<7pvE
sm = cn.createStatement("insert into corp...); ZDbc
sm.executeUpdate(); ]XI*Wsn
sm.close(); m1Y>Nj[f
3、提交 >JiltF7H0
cn.commit(); zN
[2YJ$
4、如果发生异常,那么回滚 rETRTp0HT
cn.rollback();