java 数据库基本操作 6>^k9cJp
1、java数据库操作基本流程 6R,b 8
2、几个常用的重要技巧: icbYfgQ
可滚动、更新的记录集 --hnv/AjI
批量更新 V&nJT~k
事务处理 (9lx5
{:j!@w 3
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 <W{0@?y
1、取得数据库连接 [wxI
X
1)用DriverManager取数据库连接 `^Sq>R!;
例子 ^vz@d+\Kd
String className,url,uid,pwd; h2*&>Mc
className = "oracle.jdbc.driver.OracleDriver"; '.v^seU
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 3`!KndY1
uid = "system"; Lu5.$b
pwd = "manager"; )}lV41u
Class.forName(className); y`dzo`f
Connection cn = DriverManager.getConnection(url,uid,pwd); .OUE'5e p
2)用jndi(java的命名和目录服务)方式 a-hGpYJJG
例子 t9l7
% +y
String jndi = "jdbc/db"; |a\TUzq
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); SZ){1Hu
DataSource ds = (DataSource) ctx.lookup(jndi); n[-!Jp[
Connection cn = ds.getConnection(); HK.J/Zr
多用于jsp中 _QCI<|A
2、执行sql语句 w#b2iE+Bw
1)用Statement来执行sql语句 SHh(ujz,
String sql; qa?y lR"kA
Statement sm = cn.createStatement(); U$Z}<8
sm.executeQuery(sql); // 执行数据查询语句(select) ,6L>f.V^(U
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); uwzT? C A6
2)用PreparedStatement来执行sql语句 "|rqt.f2[
String sql; a^,RbV/
sql = "insert into user (id,name) values (?,?)"; PTqS L]
PreparedStatement ps = cn.prepareStatement(sql); ?Ea"%z*c5
ps.setInt(1,xxx); A4x3TW?
ps.setString(2,xxx); oPBjsQ
... z$b!J$A1
ResultSet rs = ps.executeQuery(); // 查询 _XPc0r:?>
int c = ps.executeUpdate(); // 更新 5w9<_W0d
55\mQ|.Jn
3、处理执行结果 n5/Q)*e0'#
查询语句,返回记录集ResultSet aQFHB!
更新语句,返回数字,表示该更新影响的记录数 bS<p dOX_
ResultSet的方法 S\(_"xJPp
1、next(),将游标往后移动一行,如果成功返回true;否则返回false s,x]zG"
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 r0>T7yPAK
yL-L2
4、释放连接 89bKnsV
cn.close(); <rs]@J'p
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection - %|I
IF1}}[Ht
可滚动、更新的记录集 N%+M+zEJ
1、创建可滚动、更新的Statement r MlNp?{_
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); :Ib\v88WIv
该Statement取得的ResultSet就是可滚动的 Is[0ri
2、创建PreparedStatement时指定参数 ;*p}~#2
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); {{\HU0g>&
ResultSet.absolute(9000); ;q2T*4NN
批量更新 D.?gV_
1、Statement &@+;]t
Statement sm = cn.createStatement(); %+~0+ev7r
sm.addBatch(sql1); bv "S(
sm.addBatch(sql2); v},sWjv
... vCM'nkXY
sm.executeBatch() D5x^O2
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 dQ]j
r.
2、PreparedStatement 9 pn1d.
PreparedStatement ps = cn.preparedStatement(sql); ;f
Gi5=-
{ `u-Y 5mY
ps.setXXX(1,xxx); >B0S5:S$W
... `Ec+i
ps.addBatch(); H'2 =yhtVh
} {YFru6$
ps.executeBatch(); al/~
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 \N30SG?o
&n|gPp77$
事务的处理 {$^|^n5j
1、关闭Connection的自动提交 i{2KMa{K
cn.setAutoCommit(false); N<x5:f#+
2、执行一系列sql语句 z5I<,[`
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close H@zpw1fH+
Statement sm ; @p;4g_F
sm = cn.createStatement(insert into user...); A:f+x|[
sm.executeUpdate(); y06 2/$*$
sm.close(); f+&yc'[
sm = cn.createStatement("insert into corp...); JLhp25{x
sm.executeUpdate(); sdLFBiR
sm.close(); f[w$3
3、提交 B}W^s;h
cn.commit(); })B)-8
4、如果发生异常,那么回滚 ?k#%AM
cn.rollback();