java 数据库基本操作 t4zkt!`B
1、java数据库操作基本流程 Cz\ew B
2、几个常用的重要技巧: ~obqG!2m
可滚动、更新的记录集 "$+Jnc!!
批量更新 7vrl'^ 1
事务处理 |Mup8(gCk
[B#R94
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ;o2$
Q
1、取得数据库连接 m.#
VYN`+A
1)用DriverManager取数据库连接 bYpntV
例子 t^R][Ay&
String className,url,uid,pwd; |,gc_G
className = "oracle.jdbc.driver.OracleDriver"; 2Mc3|T4)U
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ODNM+#}`
uid = "system"; nYR#
pwd = "manager"; Wz49i9e+d
Class.forName(className); [q)8N
Connection cn = DriverManager.getConnection(url,uid,pwd); bMg(B-uF7
2)用jndi(java的命名和目录服务)方式 Ui_8)z _
例子 |ef7bKU8
String jndi = "jdbc/db"; cl=EA6P\X
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); aQ?/%\>
DataSource ds = (DataSource) ctx.lookup(jndi); 5\5/
Connection cn = ds.getConnection(); Y)0*b5?1r
多用于jsp中 DS.RURzd{r
2、执行sql语句 AS'R?aX|C
1)用Statement来执行sql语句 /YW>*?"N
String sql; p*4':TFuD;
Statement sm = cn.createStatement(); :dl]h&C^
sm.executeQuery(sql); // 执行数据查询语句(select) r3&G)g=u
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); |[<_GQl
2)用PreparedStatement来执行sql语句 rb5~XnJk
String sql; \o}xF@sM5
sql = "insert into user (id,name) values (?,?)"; 5[k/s}g
PreparedStatement ps = cn.prepareStatement(sql); Bu<M\w?7Y
ps.setInt(1,xxx); ;4R$g5-4X
ps.setString(2,xxx); wSzv|\
G
... 591>rh)
ResultSet rs = ps.executeQuery(); // 查询 u]<,,
int c = ps.executeUpdate(); // 更新 5nv#+ap1 "
C%$edEi
3、处理执行结果 :)wy.r;N
查询语句,返回记录集ResultSet bf ]f=;.+
更新语句,返回数字,表示该更新影响的记录数 \r;#g{
_
ResultSet的方法 Vwg|K|
1、next(),将游标往后移动一行,如果成功返回true;否则返回false #%a;"w
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 jaTh^L
3oGt3F{gZ
4、释放连接 5{|7$VqPF
cn.close(); gf#{k2r
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection BgurzS4-
dA@]!
可滚动、更新的记录集 gp};D
1、创建可滚动、更新的Statement 8;b(0^
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); m,*QP*
该Statement取得的ResultSet就是可滚动的 \\PjKAsh
2、创建PreparedStatement时指定参数 $UMFNjL
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Ygm`ZA y
ResultSet.absolute(9000); 1-%fo~!l
批量更新 a,@]8 r-"
1、Statement ~("5yG
Statement sm = cn.createStatement(); 1->dMm}G[
sm.addBatch(sql1); jqWu
sm.addBatch(sql2); \f]k CB
... <C1H36p
sm.executeBatch() C]O(T2l{l
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 RkH W
2、PreparedStatement x[wq]q#*
PreparedStatement ps = cn.preparedStatement(sql); fM]+SMZy
{ @K\~O__
ps.setXXX(1,xxx); M>wYD\oeg
... D"Bl:W'?j
ps.addBatch(); /7aBDc-v
} =e/9&993
ps.executeBatch(); s>B5l2Q4
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 j`JMeCG=Ee
V, Z|tB^
事务的处理 +6sy-<ZL:
1、关闭Connection的自动提交 <;9I@VYK
cn.setAutoCommit(false); [>+4^&
2、执行一系列sql语句 s`M9
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close (|[2J3ZET
Statement sm ; @oNH@a
j%
sm = cn.createStatement(insert into user...); *? 5*m+
sm.executeUpdate(); ;X8yFq
sm.close(); EY^1Y3D w0
sm = cn.createStatement("insert into corp...); bx#>BK!
sm.executeUpdate(); F |d\k Q
sm.close(); +DW~BS3
3、提交 3B1XZm
cn.commit(); #ZJ _T`l
4、如果发生异常,那么回滚 =}lh_
cn.rollback();