java 数据库基本操作 t%B!\]
1、java数据库操作基本流程 KY&,(z
2、几个常用的重要技巧: W&f Py%g
可滚动、更新的记录集 !:[n3.vm
批量更新 H[k3)r2
事务处理 ?s} E<Kr
$uB(@Ft.
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 0$ac1;7
1、取得数据库连接 [E1|jcmQ
1)用DriverManager取数据库连接 ;rAW3
例子 2Lgvy/uN
String className,url,uid,pwd; P]{.e UB@c
className = "oracle.jdbc.driver.OracleDriver"; 8 %f!
X51
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; #%tL8/K*
uid = "system"; !Y(qpC:$
pwd = "manager"; B4&pBiG&f6
Class.forName(className); pAmI ](
Connection cn = DriverManager.getConnection(url,uid,pwd); u$p|hd
d
2)用jndi(java的命名和目录服务)方式 svjFy/T(lL
例子 .: ;Hh~
String jndi = "jdbc/db"; e"mfJY
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Ayt!a+J
DataSource ds = (DataSource) ctx.lookup(jndi); F<Z=%M3e
Connection cn = ds.getConnection(); ',7Z1O
多用于jsp中 ,)G+h#Y[*
2、执行sql语句 q\Kdu5x{
1)用Statement来执行sql语句 =8_TOvSJ4p
String sql; :"IH *7xp
Statement sm = cn.createStatement(); <yO9j
sm.executeQuery(sql); // 执行数据查询语句(select) *sVxjZvV
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); { F8,^+b|
2)用PreparedStatement来执行sql语句
(HKm2JuFG
String sql; f(o`=% k8
sql = "insert into user (id,name) values (?,?)"; LfM(DK
PreparedStatement ps = cn.prepareStatement(sql); JjML!;
ps.setInt(1,xxx); A|Gqjy^;@
ps.setString(2,xxx); ^:ngHue8~
... &\[J
ResultSet rs = ps.executeQuery(); // 查询 .]c:Zt}P
int c = ps.executeUpdate(); // 更新 Utp\}0GZY
YKd?)$J
3、处理执行结果 Mg/2w
查询语句,返回记录集ResultSet bA,D]
更新语句,返回数字,表示该更新影响的记录数 C,u.!g;lm
ResultSet的方法 C YKGf1;If
1、next(),将游标往后移动一行,如果成功返回true;否则返回false #eyx
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 *OcptmY<
(5;xs
4、释放连接 .e#j#tQp
cn.close(); ?7a[|-
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ovFfTP<3V
`Db}q^mQ
可滚动、更新的记录集 zZiVBUmE<
1、创建可滚动、更新的Statement wuQkeWxJ
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); f+AIxSw
该Statement取得的ResultSet就是可滚动的 2GS2,
2、创建PreparedStatement时指定参数 0M -AIQ5
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); [~S0b
ResultSet.absolute(9000); _lqAxWH
批量更新 <sOB j'
1、Statement hJNA%
Statement sm = cn.createStatement(); ohk =7d.'
sm.addBatch(sql1); }cmL{S
sm.addBatch(sql2); ,DLNI0uV
... ')RK(I
sm.executeBatch() 8, ^UQ5x
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 7IH{5o\e
2、PreparedStatement SoIMf tX
PreparedStatement ps = cn.preparedStatement(sql); m:CpDxzbf
{ qChPT :a
ps.setXXX(1,xxx); CP^^ct-C
... /VkJ+%}+j
ps.addBatch(); s:P-F0q!&
} o*'3N/D~
ps.executeBatch(); 6dMpd4"\
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ep|u_|sB/r
5]JXXdt
事务的处理 XW:(FzF
1、关闭Connection的自动提交 5w3'yA<vE
cn.setAutoCommit(false); omP7|
2、执行一系列sql语句 8/v_ uEG
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close VZR6oia
Statement sm ; :+$_(*Z
sm = cn.createStatement(insert into user...); >=Veu; A
sm.executeUpdate(); 0IuU4h5Fr
sm.close(); ly+7klQ;.
sm = cn.createStatement("insert into corp...); 9,+LNZ'k
sm.executeUpdate(); m%puD9
sm.close(); 6m&I_icM
3、提交 :Fl: bRH+
cn.commit(); (fS4qz:&l
4、如果发生异常,那么回滚 v<4zcMv
cn.rollback();