java 数据库基本操作 KmX?W/%R
1、java数据库操作基本流程 Q~-M B]'
2、几个常用的重要技巧: 2)F~
可滚动、更新的记录集 w7e+~8|
批量更新 A>Y#-e;<d
事务处理 !?aL_{7J
K?]c
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 *1b1phh0/
1、取得数据库连接 2JR$
1)用DriverManager取数据库连接 k.6gX<T
例子 o/\f+iz7
String className,url,uid,pwd; 5)=YTUCk
className = "oracle.jdbc.driver.OracleDriver"; XNaiMpp'
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; &fRZaq'2R
uid = "system"; =8W'4MC
pwd = "manager"; RA3!k&8?#
Class.forName(className); =C4!h'hz
Connection cn = DriverManager.getConnection(url,uid,pwd); p->b Vt
2)用jndi(java的命名和目录服务)方式 +'ADN!(B_
例子 "eH.<&
String jndi = "jdbc/db"; P>wTp)
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); *V[6ta'
DataSource ds = (DataSource) ctx.lookup(jndi); * R_mvJlT
Connection cn = ds.getConnection(); ,1ceNF#oL
多用于jsp中 Z~6PrM-M
2、执行sql语句 O!ngQrI
1)用Statement来执行sql语句 48g`i
String sql; "8*5!anu-
Statement sm = cn.createStatement(); )Q5ja}-{V
sm.executeQuery(sql); // 执行数据查询语句(select) |HfN<4NL
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); eZvG
2)用PreparedStatement来执行sql语句 uD8,E!\
String sql; oeA}b-Ct0
sql = "insert into user (id,name) values (?,?)"; Jf3xK"in
PreparedStatement ps = cn.prepareStatement(sql); <c_'(
ps.setInt(1,xxx);
c W^
ps.setString(2,xxx); _@A%t&l
... c0.? d]
ResultSet rs = ps.executeQuery(); // 查询 ykBq?Vr
int c = ps.executeUpdate(); // 更新 Scz/2vNi`
Z_WJgH2c
3、处理执行结果 586lN22xM
查询语句,返回记录集ResultSet q6AL}9]9
更新语句,返回数字,表示该更新影响的记录数 z$b'y;k
ResultSet的方法 )Q)H!yin
1、next(),将游标往后移动一行,如果成功返回true;否则返回false bSm*/Q
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Cp!Qd e
4&}dA^F
4、释放连接 ZB'ms[
cn.close(); .3:s4=(f
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection "jA?s9
Yue#
可滚动、更新的记录集 wdLlQD
1、创建可滚动、更新的Statement cIB[D.
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); <-s5
;xwtS
该Statement取得的ResultSet就是可滚动的 D]*<J"/]d
2、创建PreparedStatement时指定参数 q7aH=dhw
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); m5kt
O^EU
ResultSet.absolute(9000); kx6-8j3gD7
批量更新 /;V:<mekf
1、Statement DEN (pA\
Statement sm = cn.createStatement(); ^hyp}WN
sm.addBatch(sql1); :#nv:~2]
sm.addBatch(sql2); ^#p+#_*V
... K<~J*k<v
sm.executeBatch() ^/:G`'
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 4fgYO]
2、PreparedStatement ?7cT$/4
PreparedStatement ps = cn.preparedStatement(sql); R|JBzdK+P
{ r~Vb*~U"
ps.setXXX(1,xxx); 6[S-%|f
... |L%d^m
ps.addBatch(); z3C@0v=u>
} }e8u p*#me
ps.executeBatch(); l<dtc[
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 V4tObZP3Ff
AB[#
事务的处理 ^7-l<R[T
1、关闭Connection的自动提交 @*"H{xo.U
cn.setAutoCommit(false); QvvH/u
2、执行一系列sql语句 V)#rP?Y
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close L3|~
i&k
Statement sm ; #:M <<gk
sm = cn.createStatement(insert into user...); D?`|`Mu
sm.executeUpdate(); !6pE0(V^+4
sm.close(); 1qN+AT
sm = cn.createStatement("insert into corp...); W_Eur,/`
sm.executeUpdate(); k:*(..!0z
sm.close(); &+Yoob]P
3、提交
ie4BE'
cn.commit(); u[+/WFH
4、如果发生异常,那么回滚 U "kD)\
cn.rollback();