java 数据库基本操作 (o6A?37i
1、java数据库操作基本流程 -7C=- \]
2、几个常用的重要技巧: (AyRs7Dkn
可滚动、更新的记录集 (
SC7m/
批量更新 X:zyzEhS
事务处理 /_ hfjCE
ul5::
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 A_X^k|)T
1、取得数据库连接 IArpCF/"8
1)用DriverManager取数据库连接 (>)+;$Dr,\
例子 x r+E
String className,url,uid,pwd; A7I8Z6&
className = "oracle.jdbc.driver.OracleDriver"; 5jj57j"
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 9e :d2
uid = "system"; MO(5-R`
pwd = "manager"; ;1(qGy4
Class.forName(className); |?pYJkrYO
Connection cn = DriverManager.getConnection(url,uid,pwd); <7RkM
2)用jndi(java的命名和目录服务)方式 \a~;8):q=i
例子 XH_qA[=c]
String jndi = "jdbc/db"; lN]X2 4t
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); .[eSKtbc)
DataSource ds = (DataSource) ctx.lookup(jndi); FHnHhB [
Connection cn = ds.getConnection(); 6P/9Vh j'
多用于jsp中 N|^!"/
2、执行sql语句 i >/@]2
1)用Statement来执行sql语句 fu7[8R"{
String sql; ;#Crh}~
Statement sm = cn.createStatement(); QKL]O*
sm.executeQuery(sql); // 执行数据查询语句(select) ~k:>Xo[|O
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); =-a?oH-
2)用PreparedStatement来执行sql语句 ,_4KyLfBF
String sql; g'l7Jr3
sql = "insert into user (id,name) values (?,?)"; Q%b46"
PreparedStatement ps = cn.prepareStatement(sql); .bY1N5=sz
ps.setInt(1,xxx); [))2u:tbS\
ps.setString(2,xxx); u0$5Fd&X
... Hf E;$
ResultSet rs = ps.executeQuery(); // 查询 ;Vtpq3
int c = ps.executeUpdate(); // 更新 `(w kqa
z<C~DH
3、处理执行结果 Vv*5{_
查询语句,返回记录集ResultSet 07HX5 Hd
更新语句,返回数字,表示该更新影响的记录数 aV0;WH_3
ResultSet的方法 5Dh&ez`oR'
1、next(),将游标往后移动一行,如果成功返回true;否则返回false nG(|7x
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Xb07 l3UG
R}=]UOqH-
4、释放连接 n$\6}\k
cn.close(); fSb@7L
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection u{y5'cJ{
^,\se9=(
可滚动、更新的记录集 GQc%OQc\
1、创建可滚动、更新的Statement %@,:RA\pm
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 5tbiNm^X
该Statement取得的ResultSet就是可滚动的 q=i,'.nS
2、创建PreparedStatement时指定参数 4 9+}OIX
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); c+
H)1Dfq
ResultSet.absolute(9000); s t 3]Yy
批量更新 M3xi 0/.
1、Statement )-6[Bw
Statement sm = cn.createStatement(); 8i+jFSZ$
sm.addBatch(sql1); hF?\K^tF
sm.addBatch(sql2); Q0oDl8~
... ZBh@%A
sm.executeBatch() DW;.R<8
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 l>Oe ,`9O
2、PreparedStatement ;:K?7wfXn
PreparedStatement ps = cn.preparedStatement(sql); BtDgv.;GH
{ ohG43&g~
ps.setXXX(1,xxx); zJym`NF
... v+,
w{~7RH
ps.addBatch(); {gq:sj>
} /)HEx&SQmZ
ps.executeBatch(); ^SES')x
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 m]b.P,~v
+r34\mAO
事务的处理 i_Q4bhVj
1、关闭Connection的自动提交 Z_TbM^N
cn.setAutoCommit(false); -Z#]_C{Y-)
2、执行一系列sql语句 .cnw?EI
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close E"vi+'(v
Statement sm ; ]{ l
O
sm = cn.createStatement(insert into user...); ;Q%19f3,6
sm.executeUpdate(); \}_7^)S;
sm.close(); L``mF(R^
sm = cn.createStatement("insert into corp...); m+JGe5fR<
sm.executeUpdate(); :y)&kJpleP
sm.close(); $[9V'K
3、提交 NhaeAD
$e
cn.commit(); 1F%*k &R
4、如果发生异常,那么回滚 r:b.>5CS)
cn.rollback();