java 数据库基本操作 ft"-
1、java数据库操作基本流程 Vmz#u1gGT6
2、几个常用的重要技巧: y)r`<B
可滚动、更新的记录集 o*T?f)_[p
批量更新 b~;:[ #
事务处理 G>~/
'[
c-$X2Ak
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ^P^"t^O
1、取得数据库连接 AA-$;s
1)用DriverManager取数据库连接 $$AZ)#t[
例子 cfmwz~S6i
String className,url,uid,pwd; h(WlJCln
className = "oracle.jdbc.driver.OracleDriver"; <n_?$ TJ
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; a-*sm~u
uid = "system"; su0K#*P&I
pwd = "manager"; \:'GAByy
Class.forName(className); ;v8TT}R
Connection cn = DriverManager.getConnection(url,uid,pwd); zkt~[-jm}
2)用jndi(java的命名和目录服务)方式 CW`^fI9H
例子
Zl_sbIY
String jndi = "jdbc/db"; N\|B06X
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); TjpyU:R,&|
DataSource ds = (DataSource) ctx.lookup(jndi); IO7z}![V;
Connection cn = ds.getConnection(); '[r: pwE
多用于jsp中
dX\OP>
2、执行sql语句 FC 8<D
1)用Statement来执行sql语句 zBm~ J%
String sql; Vc\g"1x
Statement sm = cn.createStatement(); clDn=k<
sm.executeQuery(sql); // 执行数据查询语句(select) mjOxmwo
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); /}u:N:HA%
2)用PreparedStatement来执行sql语句 b'(AVA
String sql; Ioe.[&o6B
sql = "insert into user (id,name) values (?,?)"; s-#@t
PreparedStatement ps = cn.prepareStatement(sql); uNewWtUb(
ps.setInt(1,xxx); mB2}(DbhE
ps.setString(2,xxx); Rd(8j+Q?ps
... [KUkv
ResultSet rs = ps.executeQuery(); // 查询 `&I6=,YLp
int c = ps.executeUpdate(); // 更新 hGFi|9/-u
<\*)YKjn/@
3、处理执行结果 {9J|\Zz3
查询语句,返回记录集ResultSet 28JVW3&)
更新语句,返回数字,表示该更新影响的记录数 s=$xnc}mf
ResultSet的方法 $%U}k=-
1、next(),将游标往后移动一行,如果成功返回true;否则返回false $d1ow#ROgy
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 xpZ@DK;
l>jrY1u
4、释放连接 UXZ3~/L5 O
cn.close(); )g=mv*9>
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection .0nT*LF
`LH 9@Z{
可滚动、更新的记录集 t:dvgRJt*
1、创建可滚动、更新的Statement Ob%iZ.D|3<
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); [voc_o7AI
该Statement取得的ResultSet就是可滚动的 yO-2.2h
2、创建PreparedStatement时指定参数 (muJ-~CJk
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); '+_-r'2
ResultSet.absolute(9000); <F`9;WX
批量更新 02 FLe*zQ
1、Statement H F*~bL
Statement sm = cn.createStatement(); )fXxkOd
sm.addBatch(sql1); 5hqXMs
sm.addBatch(sql2); ko.%@Y(=
... `B?+1Gv
sm.executeBatch() @MQfeM-@
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 |yNyk7~
2、PreparedStatement EAY+#>L*
PreparedStatement ps = cn.preparedStatement(sql); q2k}bb +
{ -X *.scw
ps.setXXX(1,xxx); !}A`6z
... 4PC'7V=S
ps.addBatch(); \>T1&JT
} ]Y
&
2&
ps.executeBatch(); &2@"zD
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 zt((TD2
9[t-W:3c7
事务的处理 dyqk[$(
1、关闭Connection的自动提交 ?n<sN"
cn.setAutoCommit(false); WKr4S<B8mr
2、执行一系列sql语句 L9[m/(:y
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ^`-Hg= d
Statement sm ; %jUZc:06
sm = cn.createStatement(insert into user...); E.'6p \
sm.executeUpdate(); .K940& Ui
sm.close(); )p!")
:'fv
sm = cn.createStatement("insert into corp...); >yyu:dk-;
sm.executeUpdate(); &xj40IZ
sm.close(); -8:O?]+Q/
3、提交 WbFCj0
cn.commit(); lYS4Q`z$
4、如果发生异常,那么回滚 qq^[(n
cn.rollback();