java 数据库基本操作 h m"B kOA
1、java数据库操作基本流程 g5cR.]oz
2、几个常用的重要技巧: |h'ugx1iY
可滚动、更新的记录集 6`yq4!&v
批量更新 !=-l760
事务处理 bNC1[GG[
WgjaMmht
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 8FMP)N4+
1、取得数据库连接 FrVD~;
1)用DriverManager取数据库连接 iD\joh-C
例子 +EFurdX\
String className,url,uid,pwd; zJ\I%7h*
className = "oracle.jdbc.driver.OracleDriver"; Fm@GU
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; LR^b?.#>
uid = "system"; `R^)<v*
pwd = "manager"; T}zi P
Class.forName(className); [-%oO
Connection cn = DriverManager.getConnection(url,uid,pwd); w#o<qrpHf
2)用jndi(java的命名和目录服务)方式 rF5<x3
例子 UeVF@rw
String jndi = "jdbc/db"; 6"wY;E
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ZHZ>YSqCS
DataSource ds = (DataSource) ctx.lookup(jndi); )JjfPb64
Connection cn = ds.getConnection(); z`BRz&
多用于jsp中 %=|I;kI?
2、执行sql语句 XnNK)dUT}
1)用Statement来执行sql语句 K<t(HK#[
String sql; > {:8c-\2}
Statement sm = cn.createStatement(); YRwS{e*u
sm.executeQuery(sql); // 执行数据查询语句(select) :s4CWEd
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); A*$vk2VWw
2)用PreparedStatement来执行sql语句 wM|-u/9+
String sql; ?GFVV ->i
sql = "insert into user (id,name) values (?,?)"; -wO`o<
PreparedStatement ps = cn.prepareStatement(sql); # ><.zZ
ps.setInt(1,xxx); Ao,lEjN I
ps.setString(2,xxx); fpzTv3D=I
... L'c4i[~s
ResultSet rs = ps.executeQuery(); // 查询 &
z?y
int c = ps.executeUpdate(); // 更新 { u;ntDr
3(CUC
3、处理执行结果 V9MA)If>
查询语句,返回记录集ResultSet <uAqb Wu
更新语句,返回数字,表示该更新影响的记录数 f5O*Njl
ResultSet的方法 0!^{V:DtQ
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 20J:_+=]
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 `aC#s3[
4iKT
4、释放连接 wOOPuCw?
cn.close(); kt@+UK."
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection yeW|Ux:
"c}bqoN
可滚动、更新的记录集 vzVl2
1、创建可滚动、更新的Statement 6h5*b8LxA
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); *zmbo >{(
该Statement取得的ResultSet就是可滚动的 *d%m.:)N
2、创建PreparedStatement时指定参数 ]2(
%^#qBG
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); l\S..B
+
ResultSet.absolute(9000); c~>M7e(
批量更新 ^x4gUT-Wy
1、Statement SmRU!C$A
Statement sm = cn.createStatement(); ;A|6&~E0G
sm.addBatch(sql1); +xWT)h/
sm.addBatch(sql2); (;s\Ip0
... pE=wP/#
sm.executeBatch() M#:Mwa$
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 3fGy
2、PreparedStatement ?.4u'Dkn=
PreparedStatement ps = cn.preparedStatement(sql); O/GD[9$i
{ > sUk6Z~
ps.setXXX(1,xxx); al^ yCoB
... D7=gUm>
ps.addBatch(); 94n,13
} R=E )j^<F
ps.executeBatch(); 9'T(Fc
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 )2R:P`U
Z'u`)jR
事务的处理 rMI:zFS
1、关闭Connection的自动提交 GSMP)8W
cn.setAutoCommit(false); WJ
mj|$D
2、执行一系列sql语句 nc`[f y|}
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Qz
$ 1_vO
Statement sm ; QK;A>]
sm = cn.createStatement(insert into user...); 6-<r@{m$
sm.executeUpdate(); '&UX'Dd~Q
sm.close(); 6~}=? sX4
sm = cn.createStatement("insert into corp...); yvVs9"|0
sm.executeUpdate(); 9<xe%V=ki
sm.close(); QjRVdb>
3、提交 4u"O/rt
cn.commit(); b|4h2iuM
4、如果发生异常,那么回滚 7^:s/xHO*
cn.rollback();