java 数据库基本操作 j-| !QlB
1、java数据库操作基本流程 V \/Qik{h
2、几个常用的重要技巧: 1'1>B
可滚动、更新的记录集 #@E:|^$1y
批量更新 00yWk_w
事务处理 ;"8BbF.
"1UpoF'w
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 NIp]n[=.q
1、取得数据库连接 (g1Op~EM
1)用DriverManager取数据库连接 jPn.w,=)27
例子 N7_(,Gu*R
String className,url,uid,pwd; )&%Y{a#
className = "oracle.jdbc.driver.OracleDriver"; hd`jf97*
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; z]2lT
IWg
uid = "system"; $h5QLN
pwd = "manager"; J.]`l\
Class.forName(className); %Nx,ZD@
Connection cn = DriverManager.getConnection(url,uid,pwd); 7t/Y5Qf
2)用jndi(java的命名和目录服务)方式 h\+8eeIl
例子 Y3SV6""y/
String jndi = "jdbc/db"; 28 zZ3|Z3
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); uII! ?
DataSource ds = (DataSource) ctx.lookup(jndi); Qm_;o(
Connection cn = ds.getConnection(); }#&L
多用于jsp中 qI<c47d;q
2、执行sql语句 }[(v(1j='~
1)用Statement来执行sql语句 _`,ZI{.J^
String sql; /L./-92NH4
Statement sm = cn.createStatement(); u~~ ~@p
sm.executeQuery(sql); // 执行数据查询语句(select) Emw]`
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); d<w]>T5VW
2)用PreparedStatement来执行sql语句 gu&W:FY
String sql; |\94a
sql = "insert into user (id,name) values (?,?)"; }]^/`n
PreparedStatement ps = cn.prepareStatement(sql); ;jBS:k?
ps.setInt(1,xxx);
pQ7<\8s*
ps.setString(2,xxx); }nSu7)3$B
... uG-S$n"7K
ResultSet rs = ps.executeQuery(); // 查询 CY$
1;/
int c = ps.executeUpdate(); // 更新 KDj/S-S
86a,J3C[
3、处理执行结果 hDc2T
查询语句,返回记录集ResultSet ;J:* r0
更新语句,返回数字,表示该更新影响的记录数 hBhbcWD,ka
ResultSet的方法 t. DnF[
1、next(),将游标往后移动一行,如果成功返回true;否则返回false &>G8DvfJ9
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 J|VDZ# c7
Y' 5X4Ks|
4、释放连接 +-|}<mq
cn.close(); XD80]@\za
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 9Q\RCl_1
F)@zo/u5L
可滚动、更新的记录集 *e:2iM)8~
1、创建可滚动、更新的Statement VKg9^%#b`[
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); A=70UL
该Statement取得的ResultSet就是可滚动的 dJlK'zK
2、创建PreparedStatement时指定参数 U8@P/Z9
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); p&D7&Sb[
ResultSet.absolute(9000); 3sDyB-\&
批量更新 nGur2}>n
1、Statement AoK;6je`K^
Statement sm = cn.createStatement(); P,rLyx
sm.addBatch(sql1); dux_v"Xl
sm.addBatch(sql2); Mhc5<~?
... MM( ,D&
Z
sm.executeBatch() G&4D0f
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 5xU}}[|~-
2、PreparedStatement wNUcL*n
PreparedStatement ps = cn.preparedStatement(sql); H}(WL+7
{ qac:"z'9
ps.setXXX(1,xxx); r$ I k*R
... $4og{
ps.addBatch(); ^s$U
n6v[
} ==trl#kQ%%
ps.executeBatch(); Cu<' b'%;
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 }G!'SZ$F 5
'z@]hm#
事务的处理 -lXQQ#V
-
1、关闭Connection的自动提交 <vu~EY0.
cn.setAutoCommit(false); `,4YPjk^
2、执行一系列sql语句 2EO9IxIf
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ce719n$
Statement sm ; l_,6<wWp
sm = cn.createStatement(insert into user...); i+lq:St
sm.executeUpdate(); G;USVF-'K
sm.close(); 0T0I<t
sm = cn.createStatement("insert into corp...); K1-RJj\L
sm.executeUpdate(); i~*6JB|
sm.close(); ,mz7!c9H^a
3、提交 Yq:/dpA_
cn.commit(); /nEK|.j
4、如果发生异常,那么回滚 Ec }9R3 m
cn.rollback();