java 数据库基本操作 URh5ajoR%
1、java数据库操作基本流程 %<q"&]e,
2、几个常用的重要技巧: )5<dmK@
可滚动、更新的记录集 Vz5<Gr
批量更新 DAN"&&
事务处理 u0uz~ s
3WfZ zb+
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 @6U&7!
1、取得数据库连接 u7p:6W
1)用DriverManager取数据库连接 2<2a3'pG
例子 v!mP9c
j
String className,url,uid,pwd; phwq#AxQ
className = "oracle.jdbc.driver.OracleDriver"; X5tV Xd
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; lvk*Db$
uid = "system"; 4uVyf^f\]f
pwd = "manager"; -x/g+T-
Class.forName(className); M9yqJPS}B
Connection cn = DriverManager.getConnection(url,uid,pwd); F zBny[F
2)用jndi(java的命名和目录服务)方式
G0r(xP?
例子 ,5sv;
String jndi = "jdbc/db"; 9FT==>
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 3fop.%(
DataSource ds = (DataSource) ctx.lookup(jndi); b` 9Zin
Connection cn = ds.getConnection(); Y k"yup@3
多用于jsp中 +@rc(eOwvN
2、执行sql语句 ~vR<UQz
1)用Statement来执行sql语句 ;ZrFy=Iv
String sql; 5kv]k?
Statement sm = cn.createStatement(); q 7+ |U%!9
sm.executeQuery(sql); // 执行数据查询语句(select) 6~k qU4lL
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); P_@ty~u
2)用PreparedStatement来执行sql语句 M?$tHA~OX
String sql; lFgE{;z@
sql = "insert into user (id,name) values (?,?)"; O#U_mgfzJ
PreparedStatement ps = cn.prepareStatement(sql); 4vH.B)S-
ps.setInt(1,xxx); t6+>Zr
ps.setString(2,xxx); :~,akX$
... ZQJh5.B
ResultSet rs = ps.executeQuery(); // 查询 Lr>4~1:`
int c = ps.executeUpdate(); // 更新 {
lZ<'p
1T3YFt@&I
3、处理执行结果 )T^aJ-Uf
查询语句,返回记录集ResultSet 0ENqK2
更新语句,返回数字,表示该更新影响的记录数 A kqGk5e
^
ResultSet的方法 #|e5i9l*B
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 1Imb"E
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 pq5bK0NQ
JDMsco+j5
4、释放连接 +d6Jrd*
cn.close(); sy9Yd PPE
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Y9(BxDP_+Y
ewinG-hX_
可滚动、更新的记录集 *-_joAWTG
1、创建可滚动、更新的Statement IG@@CH
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); |VoYFoiQ
该Statement取得的ResultSet就是可滚动的 =u&NdMy
2、创建PreparedStatement时指定参数 W!Rr_'yFe)
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 7.v{ =UP
ResultSet.absolute(9000); ~H gN'#Y?
批量更新 `VOLw*Ci
1、Statement ]JHY(H2|
Statement sm = cn.createStatement(); "6
sm.addBatch(sql1); dU"C=c(w\
sm.addBatch(sql2); _k
W:FB
... xJ|Z]m=d
sm.executeBatch() x\(yjNZH
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 TGPHjSZ1
2、PreparedStatement IRDD
PreparedStatement ps = cn.preparedStatement(sql); .rbKvd?-}
{ hB*3Py27L
ps.setXXX(1,xxx); wsCT9&p
... ok9G 9|HA
ps.addBatch(); d e~3:
} :20k6 )
ps.executeBatch(); t+SLU6j,
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 j(=zc6m
TsZX'Yn
事务的处理 E@;v|Xc
1、关闭Connection的自动提交 X<$8'/p r
cn.setAutoCommit(false); : ]JsUb{YK
2、执行一系列sql语句 \"@ `Rf
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close >z a= v
Statement sm ; GEf[k OQ
sm = cn.createStatement(insert into user...); I*i$!$Bx2
sm.executeUpdate(); <b;Oap3
sm.close(); vro5G')
sm = cn.createStatement("insert into corp...); \A3yM{G~+
sm.executeUpdate(); F30jr6F\
sm.close(); ]z /
3、提交 s((_^yf
cn.commit(); ?GGh )";y
4、如果发生异常,那么回滚 nnO@$T
cn.rollback();