java 数据库基本操作 Ff/Ig]Lb
1、java数据库操作基本流程 }|He?[TR
2、几个常用的重要技巧: ib50LCm
可滚动、更新的记录集 3}M\c)
批量更新 5!:._TcO
事务处理 75(W(V(q
@f=RL)$|
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 M]0^ind
1、取得数据库连接 nL;K|W
1)用DriverManager取数据库连接 XqFu(Lm8=
例子 Gm@iV,F%R
String className,url,uid,pwd; T{ nQjYb?
className = "oracle.jdbc.driver.OracleDriver"; r
}
7:#XQ
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ib Ue*Z["1
uid = "system"; F^TAd
pwd = "manager"; LV=^jsQ5
Class.forName(className); -R@JIe_28f
Connection cn = DriverManager.getConnection(url,uid,pwd); DB Xm
2)用jndi(java的命名和目录服务)方式 M7U:g}
例子 -RCv7U`
String jndi = "jdbc/db"; !d|8'^gc
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); j&llrN
DataSource ds = (DataSource) ctx.lookup(jndi); AFtCqq#[
Connection cn = ds.getConnection(); El1:?4;
多用于jsp中 B}k'@;G
2、执行sql语句 77_g}N
1)用Statement来执行sql语句 `wV|q~
String sql; +QupM
Statement sm = cn.createStatement(); ^^Bm$9
sm.executeQuery(sql); // 执行数据查询语句(select) Uf[T _
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); )6C`&Mj
2)用PreparedStatement来执行sql语句 $:]tcY-L9
String sql; $nc, ?)i!
sql = "insert into user (id,name) values (?,?)"; hwZ6.
PreparedStatement ps = cn.prepareStatement(sql); 5^o3y.J?P
ps.setInt(1,xxx); .r6YrB@['
ps.setString(2,xxx); vu>YH)N_h
... _}z_yu#jY
ResultSet rs = ps.executeQuery(); // 查询 ox
JGJ
int c = ps.executeUpdate(); // 更新 |%3O)B
hqWPf
3、处理执行结果 ]g7HEB.Y
查询语句,返回记录集ResultSet P[1m0!,B
更新语句,返回数字,表示该更新影响的记录数 8 +L7E-
ResultSet的方法 J2Y 3er
1、next(),将游标往后移动一行,如果成功返回true;否则返回false xLLC)~
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ,?#*eJD
X#Ak'%J
4、释放连接 q'fPNQg
cn.close(); HD~jU>}}
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection J,`_,T
j`+0.Zlq
可滚动、更新的记录集 1O- E],
1、创建可滚动、更新的Statement ^VC7C~NZ!M
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ?bn;{c;E
该Statement取得的ResultSet就是可滚动的 CElPU`J,\[
2、创建PreparedStatement时指定参数 &:C{/QnA
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 3P3:F2S R
ResultSet.absolute(9000); `L+~&M
批量更新 y 2cL2c$BT
1、Statement u&
AQl.u
Statement sm = cn.createStatement(); `J]<_0kX}%
sm.addBatch(sql1); Q;Q
sm.addBatch(sql2); 3[iSF5%V*p
... ^,~N7`
sm.executeBatch() T:dX4=z
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Y+OYoI
2、PreparedStatement <XY;fhnB
PreparedStatement ps = cn.preparedStatement(sql); Iy6p>z|
{ i)GeX:
ps.setXXX(1,xxx); olHH9R9:
... c-ttds
ps.addBatch(); dp33z"<3
} X!2.IsIS8
ps.executeBatch(); QId"Cl)3
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 li1v 4
$:PF9pY(
事务的处理 nq),VPJi
1、关闭Connection的自动提交 pqkcf\
cn.setAutoCommit(false); v hR twi
2、执行一系列sql语句 K`,nW6\
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close $dr27tse&<
Statement sm ; V>1D1
sm = cn.createStatement(insert into user...); )A"ZV[eOoQ
sm.executeUpdate(); XX*'N+
sm.close(); 8H&_, ;
sm = cn.createStatement("insert into corp...); Y>(ZsHu
sm.executeUpdate(); ^l&nB