java 数据库基本操作 k Pi%RvuQ
1、java数据库操作基本流程 7/&i'y
2、几个常用的重要技巧: 3LN+gXmU
可滚动、更新的记录集
@tGju\E"o
批量更新 7jL+c~
事务处理 #>iBu:\J
ywTt<;
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 sEkfmB2J/
1、取得数据库连接 %IL]
Wz<
1)用DriverManager取数据库连接 aMe]6cWHV>
例子 z$4g9
String className,url,uid,pwd; ,R#pQ
4
className = "oracle.jdbc.driver.OracleDriver"; 8Wqh 8$
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ?<)4_
uid = "system"; ~_8Dv<"a
pwd = "manager"; #.L9/b(
Class.forName(className); ZP~Mgz{f
Connection cn = DriverManager.getConnection(url,uid,pwd); wI8
2)用jndi(java的命名和目录服务)方式 >'ev_eAk
例子 b+Vfi9<
String jndi = "jdbc/db"; 6?$yBu9l
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); UTB]svC'
DataSource ds = (DataSource) ctx.lookup(jndi); 9:
N[9;('
Connection cn = ds.getConnection(); = >CADTU
多用于jsp中 q!iTDg*$
2、执行sql语句 { RH&mu
1)用Statement来执行sql语句 o@:${>jw
String sql; Heh.CD)Q
Statement sm = cn.createStatement(); xY4g2Q
J
sm.executeQuery(sql); // 执行数据查询语句(select) @+Yql
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); gR1vUad7
2)用PreparedStatement来执行sql语句 ,.DTJ7H+
String sql; E:vgG|??
sql = "insert into user (id,name) values (?,?)"; )Q= EmZbJz
PreparedStatement ps = cn.prepareStatement(sql); [$M=+YRHMW
ps.setInt(1,xxx); K)b@,/ 5
ps.setString(2,xxx); K</EVt,U~
... 0Xo>f"2<f
ResultSet rs = ps.executeQuery(); // 查询 ;E:vsVK
int c = ps.executeUpdate(); // 更新 &n$kVNE
/5:2g#S4
3、处理执行结果 epN>;e z
查询语句,返回记录集ResultSet !iv6k~.e'2
更新语句,返回数字,表示该更新影响的记录数 6<1
2j7
ResultSet的方法 /JsA[}.6
1、next(),将游标往后移动一行,如果成功返回true;否则返回false kZ<0|b
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 yX9 .yq
IR JN
4、释放连接 la4
#2>#WZ
cn.close(); S:B$c>
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 6`Hd)T5{w
gxnIur)
可滚动、更新的记录集 I;1W6uD=
1、创建可滚动、更新的Statement |BGB60}]f
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); |"}oGL6-
该Statement取得的ResultSet就是可滚动的 Ey|{yUmU+
2、创建PreparedStatement时指定参数 &3gC&b^i
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 4g4[n7
ResultSet.absolute(9000); _D+pJ{@W
批量更新 gy5 ^JL
1、Statement )j,Y(V$P
Statement sm = cn.createStatement(); de=){.7Y
sm.addBatch(sql1); f/xQy}4+~E
sm.addBatch(sql2); ~:FF"T>
... xVxN
@[
sm.executeBatch() #qLsAw--Q
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ly[j=vBV
2、PreparedStatement ^_\S)P2c
PreparedStatement ps = cn.preparedStatement(sql); \-Vja{J]
{ %_Q+@9
ps.setXXX(1,xxx); Ec/&?|$
... tJBj9{
ps.addBatch(); ^?M# |>
} )[b\wrc
ps.executeBatch(); :2t0//@X
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ='A VI-go5
<+y%k~("
事务的处理 izDfpr}s4
1、关闭Connection的自动提交 m^!Kthq
cn.setAutoCommit(false); wqxChTbs
2、执行一系列sql语句 0oK_u Y
4g
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close >}T}^F
Statement sm ; ygK@\JHn
sm = cn.createStatement(insert into user...); 3vXa#f>P<
sm.executeUpdate(); kB`
@M>[
sm.close(); e"#QUc(
sm = cn.createStatement("insert into corp...); QM('bbN
sm.executeUpdate(); 1.0:
sm.close(); +Y?)?
3、提交 ^>Vl@cW0uz
cn.commit(); s(Y2]X4
(
4、如果发生异常,那么回滚 h+rW%`B
cn.rollback();