java 数据库基本操作 H"rIOoxf
1、java数据库操作基本流程 (Jy >,~O
2、几个常用的重要技巧: (!<G` ;}u
可滚动、更新的记录集 =YR+`[bfI
批量更新 EkP(]F
事务处理 &^ =Y76
"oCXG`.k&
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 B)ibxM(n*
1、取得数据库连接 %U$%x
1)用DriverManager取数据库连接 (PnrY~9
例子 =(,dI[v
String className,url,uid,pwd; \'x?VVw
className = "oracle.jdbc.driver.OracleDriver"; L;'v,s
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; \fC}l
Ll
uid = "system"; .7H*F9
pwd = "manager"; MLn?t^v-
Class.forName(className); G]I^ zd&P
Connection cn = DriverManager.getConnection(url,uid,pwd); ":^cb =
2)用jndi(java的命名和目录服务)方式 d\rs/ee
例子 ;hPo5uZQ
String jndi = "jdbc/db"; GnW_^$Fs
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); -KCQ!0\F
DataSource ds = (DataSource) ctx.lookup(jndi); V7>{,
Connection cn = ds.getConnection(); <V*M%YWs
多用于jsp中 ;<v9i#K5
2、执行sql语句 oFS)3.
1)用Statement来执行sql语句 o(5
(]bJ
String sql; mvBUm-X
Statement sm = cn.createStatement(); 7A>glZ/x
sm.executeQuery(sql); // 执行数据查询语句(select) _+nlm5
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); tP/R9Ezp
2)用PreparedStatement来执行sql语句 ]m""ga
String sql; @33-UP9o
sql = "insert into user (id,name) values (?,?)"; iLkP@OYgQ
PreparedStatement ps = cn.prepareStatement(sql); CA ,0Fe3
ps.setInt(1,xxx); J_ `\}55n
ps.setString(2,xxx); qgsKbsl
... 4N{^niq7
ResultSet rs = ps.executeQuery(); // 查询 -\fn \n
int c = ps.executeUpdate(); // 更新 Edav }z
!CuLXuM
3、处理执行结果 Og<UW^VR
查询语句,返回记录集ResultSet YS&Q4nv-
更新语句,返回数字,表示该更新影响的记录数 3.I:`>;EO
ResultSet的方法 s&WHKCb
1、next(),将游标往后移动一行,如果成功返回true;否则返回false RLbxNn
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 $.r:
.cm$*>LW:x
4、释放连接 2aO.t
cn.close(); Hh.l,Z7i7D
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection V s1Z$HS`
TfqQh!Y
可滚动、更新的记录集 NpY zN|W:
1、创建可滚动、更新的Statement eMDraJv@
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); vh^,8pPy
该Statement取得的ResultSet就是可滚动的 VBI~U?0
2、创建PreparedStatement时指定参数 fwi(qx1=}
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); u:D,\`;)
ResultSet.absolute(9000); W%cJ#R[o
批量更新 g"L$}#iTsl
1、Statement fRd^@@,[
Statement sm = cn.createStatement(); XqTDLM&
sm.addBatch(sql1); |0/~7l
sm.addBatch(sql2); =
eDi8A*~
... ]Syr{|
sm.executeBatch() /
L/hR4
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 /0qLMlL$
2、PreparedStatement &\GB_UA
PreparedStatement ps = cn.preparedStatement(sql); \LpR7D
{ 7q[a8rUdh
ps.setXXX(1,xxx); '`Iuf\
... 7{e*isV
ps.addBatch(); 2Fsv_t&*>
} 4q\bnt
ps.executeBatch(); "i ;c )ZP
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Do5)ilt
*_7%n-k
事务的处理 |\MgE.N
1、关闭Connection的自动提交 mdTCe
HX
cn.setAutoCommit(false); vMV}M%~
2、执行一系列sql语句 Grw|8xN0t
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close >HY(
Ij<
Statement sm ; -(]s!,
sm = cn.createStatement(insert into user...); rt[w
yz8
sm.executeUpdate(); %Cz&7 qf"
sm.close(); na1*^S`[
sm = cn.createStatement("insert into corp...); td#B$$[
sm.executeUpdate(); S @MO
sm.close(); cRhu]fv()
3、提交 >ps=z$4j*
cn.commit(); Qs5^kddz=
4、如果发生异常,那么回滚 Q5H!
^RQm
cn.rollback();