java 数据库基本操作 :{xu_"nYr
1、java数据库操作基本流程 xtXK3[s
2、几个常用的重要技巧: `
-<S13
可滚动、更新的记录集 I?<ibLpX
批量更新 #Pq6q.UB
事务处理 23zR0z (L
,=}+.ax
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 BUsAEwM
1、取得数据库连接 J \I`#
1)用DriverManager取数据库连接 8O*O5
例子 6
)Qe*S
String className,url,uid,pwd; \'nE{
className = "oracle.jdbc.driver.OracleDriver"; gLg\W3TOi
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; d[ce3':z
uid = "system"; >P ygUY
d
pwd = "manager"; UWBR5
Class.forName(className); Bq85g5Dc
Connection cn = DriverManager.getConnection(url,uid,pwd); a'\fS7aE0l
2)用jndi(java的命名和目录服务)方式 "&kXAwe
例子 072`i46
String jndi = "jdbc/db"; JG'&anbm
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); A^ry|4`3(
DataSource ds = (DataSource) ctx.lookup(jndi); sJLJVSv8c
Connection cn = ds.getConnection(); Qhn>aeW,
多用于jsp中 MXY!N/
2、执行sql语句 'p'nAB''!
1)用Statement来执行sql语句 S3/Z]?o
String sql; EPeV1$
Statement sm = cn.createStatement(); )$FwB6^
sm.executeQuery(sql); // 执行数据查询语句(select) rAQ3x0
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ^eqq|(<K
2)用PreparedStatement来执行sql语句 RXbZaje$
String sql; fAeq(tI=
sql = "insert into user (id,name) values (?,?)"; 5CM]-qbf@
PreparedStatement ps = cn.prepareStatement(sql); t*!Q9GC_
ps.setInt(1,xxx); X]%n#\t,]
ps.setString(2,xxx); }Q>??~mVl
... 3ry0.
ResultSet rs = ps.executeQuery(); // 查询 [UaM}-eR
int c = ps.executeUpdate(); // 更新 ^(yU)k3pu
mINir-
3、处理执行结果 9=MxuBl
查询语句,返回记录集ResultSet ,W;2A0A?X
更新语句,返回数字,表示该更新影响的记录数 y8O<_VOO}"
ResultSet的方法 #c2JWDH1F
1、next(),将游标往后移动一行,如果成功返回true;否则返回false uTUkRqtD!
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 N6S}u@{J~N
qznd'^[
4、释放连接 ?$X1X`@
cn.close(); 6imQjtI
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection e_CgZ
*ps")?tlC
可滚动、更新的记录集 6rzXM`cs
1、创建可滚动、更新的Statement 9m_Hm')VG
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); p< jM%fbZk
该Statement取得的ResultSet就是可滚动的 ais"xm<V
2、创建PreparedStatement时指定参数 [,p[%Dza
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); {= l9{K`~
ResultSet.absolute(9000); Y-c_ 2 )
批量更新 C+c;UzbD
1、Statement t[ ^68]
Statement sm = cn.createStatement(); W-@}q}A
sm.addBatch(sql1); l8ZzKb-
sm.addBatch(sql2); &]H Y:
... 1'[_J
sm.executeBatch() tdB<
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 5i1Xumh 4
2、PreparedStatement ZZ{:f+=?$
PreparedStatement ps = cn.preparedStatement(sql); }Z}4_/E
{ |B.tBt^
ps.setXXX(1,xxx); aUX.4#|%
... FOd)zU*L2
ps.addBatch(); elm]e2)F
} *H,vqs\}y
ps.executeBatch(); veh?oJi@
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 f\gN+4)
`G^MTDp?L+
事务的处理 VE5M}kDCZ
1、关闭Connection的自动提交 g)#neEA J
cn.setAutoCommit(false); q~:k[@`.
2、执行一系列sql语句 {kgV3 [%>
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 2_lb+@[W
Statement sm ; 'uw=)8t7
sm = cn.createStatement(insert into user...); r5N.Qt8
sm.executeUpdate(); ^<O=<tN\
sm.close(); MHkTN
sm = cn.createStatement("insert into corp...); Kr'5iFK7
sm.executeUpdate(); F&x9.
sm.close(); 7nAB^~)6l
3、提交 ht%:e?@i
cn.commit(); @'{m-?*
4、如果发生异常,那么回滚 ^X/[x]UOT@
cn.rollback();