java 数据库基本操作 DrEtnt
1、java数据库操作基本流程 (Z$6JNkz
2、几个常用的重要技巧: >o} ati
可滚动、更新的记录集 s =5H.q%PV
批量更新 q],R6GcVr
事务处理 P\s+2/
O2,g]t~C
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 KNg5Ptk
1、取得数据库连接 5qr!OEF2
1)用DriverManager取数据库连接 vf yva
例子 fv_wK_.
%:
String className,url,uid,pwd; GiZ'IDV
className = "oracle.jdbc.driver.OracleDriver"; !p&'so^-W
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; SNU
bY6
uid = "system"; AY;+Ws
pwd = "manager"; -7O/ed+
Class.forName(className); ^<VE5OM
Connection cn = DriverManager.getConnection(url,uid,pwd); z`5I1#PVA
2)用jndi(java的命名和目录服务)方式 (7b_g6>:
例子 ]-'9|N*}l
String jndi = "jdbc/db"; spx;QLo
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); i/J NG
DataSource ds = (DataSource) ctx.lookup(jndi); %^l&fM*
Connection cn = ds.getConnection(); u}1vn} F{
多用于jsp中 +r$.v|6
2、执行sql语句 /
3k\kkv!
1)用Statement来执行sql语句 0tqR wKL
String sql; ee_\_"
Statement sm = cn.createStatement(); 9-Qtj49
sm.executeQuery(sql); // 执行数据查询语句(select) x!~OK::o8
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); %~5Q^3$O
2)用PreparedStatement来执行sql语句 GF!{SO4
String sql; GnOo+hB
sql = "insert into user (id,name) values (?,?)"; W`'|&7~
PreparedStatement ps = cn.prepareStatement(sql); V
3]p3
ps.setInt(1,xxx); WHZng QmY
ps.setString(2,xxx); tKeO+6 l
... Qg>GW
ResultSet rs = ps.executeQuery(); // 查询 erP>P
int c = ps.executeUpdate(); // 更新 y:OywIi(
W{+0iAYnp
3、处理执行结果 &&]!+fTZ\(
查询语句,返回记录集ResultSet $M`;."
更新语句,返回数字,表示该更新影响的记录数 ++!E9GU{
ResultSet的方法 'TrrOq4
1、next(),将游标往后移动一行,如果成功返回true;否则返回false G
r|@CZq
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 YB{E=\~
mY8=qkZE
4、释放连接 JX)z<Dz$
cn.close(); Cj1UD;
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection B^(rUR
*wB-lg7%
可滚动、更新的记录集 ,A!e"=HF
1、创建可滚动、更新的Statement MJ9SsC1
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); pInWKj[y1
该Statement取得的ResultSet就是可滚动的 >v_5xd9
2、创建PreparedStatement时指定参数 &E &iaw!
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); \ui^
d
ResultSet.absolute(9000); ]GtR8w@w
批量更新 6J-}&U
1、Statement eH!|MHe
Statement sm = cn.createStatement(); A] ?O&m|
sm.addBatch(sql1); c;rp@_ULG?
sm.addBatch(sql2); U\8#Qvghf
... h==GdS4
sm.executeBatch() 8}oDRN!J
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 f5GR#3-h(
2、PreparedStatement x0A%kp&w
PreparedStatement ps = cn.preparedStatement(sql); '}`hY1v
{ a61eH )a
ps.setXXX(1,xxx); :_\!t45
... E9d i
ps.addBatch(); quGPk)c
} UVCMB_T
ps.executeBatch();
01c/;B
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 X_({};mz
<SM&VOiaOz
事务的处理 <oaBh)=7
1、关闭Connection的自动提交 }
o"_#\6
cn.setAutoCommit(false); . 02(O
2、执行一系列sql语句 =@KY A(D
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ?*R^?[
Statement sm ; ?3TK7]1V:
sm = cn.createStatement(insert into user...); KO]?>>5S6
sm.executeUpdate(); FV6he[,
sm.close(); 7k t7^V<
sm = cn.createStatement("insert into corp...); q\b
?o!#_
sm.executeUpdate(); ,o>pmaoLs
sm.close(); ua|Z`qUyq
3、提交 l&sO?P[ /
cn.commit(); Xf_tj:eO~
4、如果发生异常,那么回滚 ~sHZh
cn.rollback();