java 数据库基本操作 s'LG3YV-<
1、java数据库操作基本流程 .:<c[EJ
b
2、几个常用的重要技巧: /B}]{bcp$
可滚动、更新的记录集 =YPWt>\a}
批量更新 +.>O%pNj
事务处理 [~jhOv^
tK8\Ib J
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ?%;uR#4
1、取得数据库连接 Xwx;m/
1)用DriverManager取数据库连接 hi.{
例子 1u&P,&T
String className,url,uid,pwd; C ,fIwqOr3
className = "oracle.jdbc.driver.OracleDriver"; M_*w)<
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; e@F&/c
uid = "system"; g:f0K2)\r:
pwd = "manager"; q:?g?v
Class.forName(className); 0imz}Z]
Connection cn = DriverManager.getConnection(url,uid,pwd); * z{D}L-&
2)用jndi(java的命名和目录服务)方式 S6]D;c8GE
例子 's&Vg09D,
String jndi = "jdbc/db"; 4H\O&pSS
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); *NXwllrci
DataSource ds = (DataSource) ctx.lookup(jndi); ;#f%vs>Y7i
Connection cn = ds.getConnection(); #*Mk@XrV
多用于jsp中 y{jv-&!xB
2、执行sql语句 )03.6Pvs
1)用Statement来执行sql语句 j-A
S {w
String sql; b*p,s9k7
Statement sm = cn.createStatement(); Qt@~y'O
sm.executeQuery(sql); // 执行数据查询语句(select) tgrQ$Yjk
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); lXB_HDY
2)用PreparedStatement来执行sql语句 Tri.>@-u
String sql; L;BYPZR
sql = "insert into user (id,name) values (?,?)"; /~AwX8X
PreparedStatement ps = cn.prepareStatement(sql); IM
+Dm
ps.setInt(1,xxx); <GoE2a4Va
ps.setString(2,xxx); n.7 $*9)#
... `5q`ibyPI
ResultSet rs = ps.executeQuery(); // 查询 {]Lc]4J
int c = ps.executeUpdate(); // 更新 lg!1q8
.|iUDp6vz
3、处理执行结果 T-<^mX[}
查询语句,返回记录集ResultSet *>\RGL;]8
更新语句,返回数字,表示该更新影响的记录数 Z;%qpsq
ResultSet的方法 yM#W,@
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Ex@#!fz{%
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 w#JF7;
]8H;LgM2
4、释放连接 Oe;9[=L[
cn.close(); {J99F
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 7:1Hgj(
?m~x%[Vn
可滚动、更新的记录集 zGz5|u
1、创建可滚动、更新的Statement +<3tv&"
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ]B5\S
该Statement取得的ResultSet就是可滚动的 ]v9<^!
2、创建PreparedStatement时指定参数 @aj"12
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 5_`.9@eh.
ResultSet.absolute(9000); BwL:B\
批量更新 071wo7
1、Statement FPcgQ
v;p
Statement sm = cn.createStatement(); 65<p:
sm.addBatch(sql1); 7Y!^88,f.
sm.addBatch(sql2); FE_n+^|k<
... ;9prsvf
sm.executeBatch() y ruN5
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 2b3*zB*@V
2、PreparedStatement x#ouR+<
PreparedStatement ps = cn.preparedStatement(sql); |d,1mmv@K
{ .Qi`5C:U
ps.setXXX(1,xxx); XPY66VC&_
... 4!monaB"e
ps.addBatch(); wS:323
!l$
} G LE`ba
ps.executeBatch(); rc;| ,\
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 0<^K0>lm
p
*1elUI2Rg
事务的处理 f|b|\/.=
1、关闭Connection的自动提交 4}NFa;M1
cn.setAutoCommit(false); F<^,j7@
2、执行一系列sql语句 Fa>Y]Y0r
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Ky$<WZs
Statement sm ; KIuYWr7&
sm = cn.createStatement(insert into user...); 52:oe1-8
sm.executeUpdate(); \x|(`;{
sm.close(); 6*]Kow?
sm = cn.createStatement("insert into corp...); kmP0gT{Sj
sm.executeUpdate(); Xbap'/t
sm.close(); DVCc^5#
3、提交 `T~M:\^D
cn.commit(); 55yP.@i9J
4、如果发生异常,那么回滚 0<o#;ZQ]
cn.rollback();