java 数据库基本操作 9Jhc5G
1、java数据库操作基本流程 2wki21oY
2、几个常用的重要技巧: wnoL<p
可滚动、更新的记录集 ,8MUTXd@ V
批量更新 v*k}{M
事务处理 \9GJa"xA`
8LM 91
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 %uWq)D4r
1、取得数据库连接 +8\1.vY
1)用DriverManager取数据库连接 |Q)c{9sD
例子 b/eJEL
String className,url,uid,pwd; )FnJLd
className = "oracle.jdbc.driver.OracleDriver"; r#CQCq
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; CHPu$eu
uid = "system";
*[^[!'kT&
pwd = "manager"; W<AxctId
Class.forName(className); Ckc4U. t|
Connection cn = DriverManager.getConnection(url,uid,pwd); :n} NQzs
2)用jndi(java的命名和目录服务)方式 {BA1C
(
例子 ?UGA-^E1
String jndi = "jdbc/db"; Anu`F%OzB
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); `/0S]?a.{B
DataSource ds = (DataSource) ctx.lookup(jndi); R;68C6 4
Connection cn = ds.getConnection(); <$]=Vaq
多用于jsp中 ~Kr_[X:d5
2、执行sql语句 97%S{_2m/
1)用Statement来执行sql语句 [aF^ D;o
String sql; 'nO%1BZj+
Statement sm = cn.createStatement(); ~ojH$=K>d
sm.executeQuery(sql); // 执行数据查询语句(select) '4""Gz
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); B]o5HA<k
2)用PreparedStatement来执行sql语句 L\u6EMyV
String sql; /Dl{I7W
sql = "insert into user (id,name) values (?,?)"; ksB-fOv*N
PreparedStatement ps = cn.prepareStatement(sql); Vk>m/"
ps.setInt(1,xxx); NQx`u"=
ps.setString(2,xxx); 5A~lu4-q
... _4]GP3`
ResultSet rs = ps.executeQuery(); // 查询 GV1SKa
int c = ps.executeUpdate(); // 更新 O"D0+BK79e
ah(lH5r
3、处理执行结果 wInJ!1
查询语句,返回记录集ResultSet ?IWLH-fkP
更新语句,返回数字,表示该更新影响的记录数 !BocF<U E
ResultSet的方法 *}hx9:9\B
1、next(),将游标往后移动一行,如果成功返回true;否则返回false $Z!$E,@c
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ,1}c% C*,Q
f;[\'_.*
4、释放连接 /R2K3E#
cn.close(); ;E"TOC
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection e95x,|.-_
QR+{Yp
可滚动、更新的记录集 _h=kjc}[.O
1、创建可滚动、更新的Statement xTy[X"sJ
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 'k?%39
该Statement取得的ResultSet就是可滚动的 H1alf_(_
\
2、创建PreparedStatement时指定参数 VOj{&O2c
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ]Ywj@-*q
ResultSet.absolute(9000); 01 vEt
批量更新 [HV>4,,3"
1、Statement uEK9
Statement sm = cn.createStatement(); I(cy<ey+e
sm.addBatch(sql1); u;[*Z
sm.addBatch(sql2); -27uh
... b?p_mQKtZ
sm.executeBatch() Bbb_}y|CA
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Kn
WjP21
2、PreparedStatement eC9nOwp]xH
PreparedStatement ps = cn.preparedStatement(sql); eX;Tufe*(Q
{ j"8 f,er
ps.setXXX(1,xxx); &m>yY{be
... `qNhB\
ps.addBatch(); cZ!%#Az
} dW32O2@-
ps.executeBatch(); E!~Ok
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 5eZ8$-&([
1kiS."77x
事务的处理 I$#B#w?!$r
1、关闭Connection的自动提交 O3?3XB> <
cn.setAutoCommit(false); R::0.*FF
2、执行一系列sql语句 Tn$/9<Q
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close zfAkWSY
Statement sm ; ^`W8>czi
sm = cn.createStatement(insert into user...); pwiXA{
sm.executeUpdate(); w3l+BUn:X
sm.close(); =~OH.=9\
sm = cn.createStatement("insert into corp...); [r_YQ*+ej
sm.executeUpdate(); aR
iD}P*V
sm.close(); Y7|R vLWoP
3、提交 h)W?8XdM
cn.commit(); y+ZRh?2
4、如果发生异常,那么回滚 ;"*\R5a
cn.rollback();