java 数据库基本操作 nv~%#|v_W
1、java数据库操作基本流程 F7O(Cy"1
2、几个常用的重要技巧: Y]B)'[=h
可滚动、更新的记录集 WZ*ws[dVI
批量更新 VCD:3U 8
事务处理 H?)w!QX
no9;<]4
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 &GB:|I'%7
1、取得数据库连接 WRrd'{sB
1)用DriverManager取数据库连接 vJ-q*qM1
例子 k{Me[B
String className,url,uid,pwd; >o7n+Rb:
className = "oracle.jdbc.driver.OracleDriver"; 29?,<bB)
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 3tZ]4ms}
uid = "system"; L_wk~z
pwd = "manager"; nh!a)]c[
Class.forName(className); 'gTb A?+@5
Connection cn = DriverManager.getConnection(url,uid,pwd); RF%KA[Dj
2)用jndi(java的命名和目录服务)方式 DUC#NZgw
例子 \v.C]{Gzc
String jndi = "jdbc/db"; o1h={ao
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Te<}*qvD
DataSource ds = (DataSource) ctx.lookup(jndi); L>SjllY
Connection cn = ds.getConnection(); +ayos[<0#
多用于jsp中 j]aoR
2、执行sql语句 :uK?4
1)用Statement来执行sql语句 ecCr6)
String sql; a*ushB
Statement sm = cn.createStatement(); {O7X`'[
sm.executeQuery(sql); // 执行数据查询语句(select) %\H|B0
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); `m!j$,c.
2)用PreparedStatement来执行sql语句 k=4N.*#`y
String sql; CkdP #}f
sql = "insert into user (id,name) values (?,?)"; ^7 &5
z&o
PreparedStatement ps = cn.prepareStatement(sql); PGLplXb#[S
ps.setInt(1,xxx); ~s]iy9i
ps.setString(2,xxx); RH O( ?8"_
... 2E)wpgUc?e
ResultSet rs = ps.executeQuery(); // 查询 zY"1drE> G
int c = ps.executeUpdate(); // 更新 @M5#S7q";
pJt,9e6
3、处理执行结果 JSTuXW
查询语句,返回记录集ResultSet .2v_H5<
更新语句,返回数字,表示该更新影响的记录数 *U]V@;XF
ResultSet的方法 "F.;Dv9V[0
1、next(),将游标往后移动一行,如果成功返回true;否则返回false .R./0Ot tx
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 OG~6L4"
<F`>,Pm
4、释放连接 G}:lzOlMH
cn.close(); z2QP)150
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection s1h/}
-1UD0(
可滚动、更新的记录集 D-4f >
1、创建可滚动、更新的Statement :]^P1sH[
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); NT+?#0I
该Statement取得的ResultSet就是可滚动的 QUQu^p
2、创建PreparedStatement时指定参数 ~XWQhIAM4
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); lJis~JLd`
ResultSet.absolute(9000); \0vr>C
批量更新 ] 0B2#
d
1、Statement p|&Yku=
Statement sm = cn.createStatement(); /5:bvg+
sm.addBatch(sql1); g#t[LI9(F[
sm.addBatch(sql2); }7
c[Q($K
... \V*xWS
sm.executeBatch() b+&%1C
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 |qmu_x\
2、PreparedStatement gm[z[~X@
PreparedStatement ps = cn.preparedStatement(sql); i* NH'o/
{ Y[K*57fs
ps.setXXX(1,xxx); 8=Z9T<K
... ( 8c9 /7h
ps.addBatch(); +L9Eqll
} P%(O|
ps.executeBatch(); B3
5E8/
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 m/y2WlcRx
li 6%)
事务的处理 @qnD=mE
1、关闭Connection的自动提交 6w(6}m.L^
cn.setAutoCommit(false); A?t%e
2、执行一系列sql语句 x*nSHb
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ,}))u0q+:
Statement sm ; 5yiK+-iTs
sm = cn.createStatement(insert into user...); OSf}Q=BL
sm.executeUpdate(); *Ie7{EhJ'
sm.close(); <c,u3cp
sm = cn.createStatement("insert into corp...); 0Pe>Es|^A#
sm.executeUpdate(); W>p-u6u%E|
sm.close(); o)2W`i &
3、提交 )8UWhl=
cn.commit(); AbYqf%~7`l
4、如果发生异常,那么回滚 {'2@(^3
cn.rollback();