java 数据库基本操作 M/qiA.C@W
1、java数据库操作基本流程 /P%:u0fX,
2、几个常用的重要技巧: IR&u55#I6
可滚动、更新的记录集 S'e2~-p0F
批量更新 Ui.F<,E
事务处理 ^eRuj)$5A
WveFB%@`;
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 -wt2ydzos
1、取得数据库连接 b,W'0gl
1)用DriverManager取数据库连接 wtKh8^:YD
例子 ublY!Af
String className,url,uid,pwd; YGO@X(ej,
className = "oracle.jdbc.driver.OracleDriver"; 5W48z%MN
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; fYi!Z/Ck2
uid = "system"; )qIK7;
pwd = "manager"; H6eGLg={
Class.forName(className); #Grm-W9E
Connection cn = DriverManager.getConnection(url,uid,pwd); ]gW J,
2)用jndi(java的命名和目录服务)方式 S7vE[VF5
例子 @:@rks&
String jndi = "jdbc/db"; `4qKQJw
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); yiq#p"Hs
DataSource ds = (DataSource) ctx.lookup(jndi); >A/=eW/q
Connection cn = ds.getConnection(); (r4\dp&
多用于jsp中 dw|0K+-PH
2、执行sql语句 ^b~5zhY&
1)用Statement来执行sql语句 J Nz0!wi
String sql;
df'g},_
Statement sm = cn.createStatement(); P.:T
zk6
sm.executeQuery(sql); // 执行数据查询语句(select) 6>I.*Qt \l
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); :Mk}Suf&H
2)用PreparedStatement来执行sql语句 [1U_c*;i
String sql; QFYy$T+W
sql = "insert into user (id,name) values (?,?)"; a6d KQ3D
PreparedStatement ps = cn.prepareStatement(sql); I'C,'
ps.setInt(1,xxx); lUEyo.xVt
ps.setString(2,xxx); 7w*&Yg]
... d8#j@='a*
ResultSet rs = ps.executeQuery(); // 查询 ?+\,a+46P_
int c = ps.executeUpdate(); // 更新 7fqYSMHR
Dhoj|lc
3、处理执行结果 rWXW}Yg
查询语句,返回记录集ResultSet |9I;`{@
更新语句,返回数字,表示该更新影响的记录数 O)R0,OPb
ResultSet的方法 F?kVW[h?q
1、next(),将游标往后移动一行,如果成功返回true;否则返回false @El<"\
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 *@nUas2"
?s]`G'=>V`
4、释放连接 JPG!cX%
cn.close(); [
UJj*n
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection )QD}R36Ic
C.-a:oQ[
可滚动、更新的记录集 o{p_s0IX;S
1、创建可滚动、更新的Statement Hi9z<l=$
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 9_3M}|V$^e
该Statement取得的ResultSet就是可滚动的 &?6w2[}
2、创建PreparedStatement时指定参数 \tx/!tA
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); {)qP34rM
ResultSet.absolute(9000); ~tvoR&{I
批量更新 GB3B4)cX4Y
1、Statement >lmL
Statement sm = cn.createStatement(); P1n@E*~V5
sm.addBatch(sql1); Uj)]nJX
sm.addBatch(sql2); DG=Ap:sl*$
... h :R)KM
sm.executeBatch() 0)!zhO_}
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ,be?GAq
2、PreparedStatement ,m,vo_Ub
PreparedStatement ps = cn.preparedStatement(sql); (xed(uFEK
{ +.I'U9QeUN
ps.setXXX(1,xxx); _4$DnQ6&
... (?y2@I}
ps.addBatch(); 6,1|y%(f
} 5QJL0fc
ps.executeBatch();
h$\hPLx
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 us%RQ8=k
zQ}N
mlk
事务的处理 CaBS0'
n
1、关闭Connection的自动提交 8zWPb
cn.setAutoCommit(false); [Gy'0P(EQ
2、执行一系列sql语句 ~*[4DQ[\
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close H~]o]uAi"
Statement sm ; C:MGi7f
sm = cn.createStatement(insert into user...); P*Sip?tdE
sm.executeUpdate(); z_@zMLs
sm.close(); FaE orQ
sm = cn.createStatement("insert into corp...); o q)"1
sm.executeUpdate(); V&v~kzLr+
sm.close(); T(^8ki
3、提交 w lg#c6#q
cn.commit(); 22~X~=
4、如果发生异常,那么回滚 wtLMc
cn.rollback();