java 数据库基本操作 dQ4K^u
1、java数据库操作基本流程 StuDtY
2、几个常用的重要技巧: \PB ~6
可滚动、更新的记录集 044*@a5f
批量更新 [ZP8[Zl'?
事务处理 zu
Jl #3YP
(SlrV8;
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 gB?~!J?
1、取得数据库连接 ~CB6+t>
1)用DriverManager取数据库连接 boR&'yX
例子 tT;=l[7%
String className,url,uid,pwd; p8q9:Tz
className = "oracle.jdbc.driver.OracleDriver"; $N#f)8v
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ' 1aU0<
uid = "system"; fuxBoB
pwd = "manager"; 2eBA&t
Class.forName(className); LF~=,S
Connection cn = DriverManager.getConnection(url,uid,pwd); O/(qi8En
2)用jndi(java的命名和目录服务)方式 3e g<)
例子 $I7/FZP
String jndi = "jdbc/db"; 3T3p[q4
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); YJ`[$0mam
DataSource ds = (DataSource) ctx.lookup(jndi); wZECG-jr/
Connection cn = ds.getConnection(); S)0bu(a`Z,
多用于jsp中 Z Tx~+'(
2、执行sql语句 Y@S?0
1)用Statement来执行sql语句 /WVnyz0
String sql; <(Wa8PY2(
Statement sm = cn.createStatement(); <M1XG7_I
sm.executeQuery(sql); // 执行数据查询语句(select) g&*pk5V>
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); X]Emz"
2)用PreparedStatement来执行sql语句 y/m^G=Q6g#
String sql; |Aw(v6
sql = "insert into user (id,name) values (?,?)"; ,Jf)A/_
PreparedStatement ps = cn.prepareStatement(sql); d/G P.d
ps.setInt(1,xxx); J(\"\Z
ps.setString(2,xxx); "b!QE2bRO
... Lj$yGd K<
ResultSet rs = ps.executeQuery(); // 查询 @awaN
int c = ps.executeUpdate(); // 更新 cf|<~7
'wAOY
3、处理执行结果 ?zKVXK7}0
查询语句,返回记录集ResultSet nzTzc5
w
更新语句,返回数字,表示该更新影响的记录数 9_rNJLj8y
ResultSet的方法 pQxaT$
1、next(),将游标往后移动一行,如果成功返回true;否则返回false =De%]]>
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 g]V}azLr
1@Bq-2OD4
4、释放连接 j}chU'if
cn.close(); W&]grG2/
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Z3G>DF:$
PiZt?r?5w|
可滚动、更新的记录集 hgE!)UE
1、创建可滚动、更新的Statement 1WPDMLuN
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); }`$:3mb&f
该Statement取得的ResultSet就是可滚动的 aho;HM$hjP
2、创建PreparedStatement时指定参数 !+.|T9P
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Oah}7!a)
ResultSet.absolute(9000); S zOB{
批量更新 :rb<mg[
1、Statement P sD+?
Statement sm = cn.createStatement(); )@3ce'
sm.addBatch(sql1); r6Z&i^cMe
sm.addBatch(sql2); }(-R`.e;
... #Xri%&~
sm.executeBatch() ke~O+]
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 _y)#N<
2、PreparedStatement J[UL
f7:
PreparedStatement ps = cn.preparedStatement(sql); 0gVylQ
{ "JSg/optc
ps.setXXX(1,xxx); 7g5sJj
... +V&b<y;?>
ps.addBatch(); ;0}$zy1EZ
} WZRrqrjq
ps.executeBatch(); A~-e?.
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 K$Y!d"D
H!&]Di1Eh
事务的处理 DT(A~U<y
1、关闭Connection的自动提交 BpCzmU
cn.setAutoCommit(false); E`>-+~ZUsk
2、执行一系列sql语句 9p(s FQ
[
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close .*D~ .!
Statement sm ; E/ (:\Cm^
sm = cn.createStatement(insert into user...); 6Pl$DSu
sm.executeUpdate(); 'M+iVF6
sm.close(); !1dCk/D&)8
sm = cn.createStatement("insert into corp...); zb~!>
QIz{
sm.executeUpdate(); lMp)T**
sm.close(); -<}_K,Ky`
3、提交 qSMSTmnQ
cn.commit(); El0|.dW
4、如果发生异常,那么回滚 Og%qv
Bj 6
cn.rollback();