java 数据库基本操作 !X,=RR`zT
1、java数据库操作基本流程 D)mqe-%1
2、几个常用的重要技巧: bZKK'd$I
可滚动、更新的记录集 T0Gu(c`1d
批量更新 pQqZ4L6v
事务处理 t<`BaU
UV:_5"-
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 .+8w\>w6g
1、取得数据库连接 M9i u#6P
1)用DriverManager取数据库连接 PgxU;N7Y
例子 Lu<'A4Q1
String className,url,uid,pwd; <CH7jbK
className = "oracle.jdbc.driver.OracleDriver"; <Siz5qQI4
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; +tO V+6Uz
uid = "system"; %]:u ^\7
pwd = "manager"; ho0T$hB
Class.forName(className); l~\'Z2op
Connection cn = DriverManager.getConnection(url,uid,pwd); kdv>QZ
2)用jndi(java的命名和目录服务)方式 }$OQw'L[
例子 ap=_odW~p
String jndi = "jdbc/db"; ` bg{\ .q
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); JNsK
DataSource ds = (DataSource) ctx.lookup(jndi); e0aeiG$/0
Connection cn = ds.getConnection(); T}g;kppC
多用于jsp中 PvO>}(=
2、执行sql语句 J\Sewg9
1)用Statement来执行sql语句 _w'4f )7
String sql; |KkVt]ZQe9
Statement sm = cn.createStatement(); WSh+5](:
sm.executeQuery(sql); // 执行数据查询语句(select) `s.y!(`q
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); O1-Ne.$
2)用PreparedStatement来执行sql语句 +nZx{d,wt
String sql; A}W&=m8!
sql = "insert into user (id,name) values (?,?)"; |)0kvf?
PreparedStatement ps = cn.prepareStatement(sql); *}LYMrP
ps.setInt(1,xxx); 7$/ O{GBJ
ps.setString(2,xxx); F|Ou5WD
... fv}h;?C
ResultSet rs = ps.executeQuery(); // 查询 tcmG>^YM
int c = ps.executeUpdate(); // 更新 xeZ,}YP)
qex.}[
3、处理执行结果 Pxl7zz&pl=
查询语句,返回记录集ResultSet <b{ApsRJf
更新语句,返回数字,表示该更新影响的记录数 sg2T)^*V
ResultSet的方法 {E>kFeg
1、next(),将游标往后移动一行,如果成功返回true;否则返回false I=.98v%
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 W4X=.vr
<@JK;qm>S
4、释放连接 T?Hs_u{
cn.close(); nIdvff
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ^cX);koO
R5|c4v{B
可滚动、更新的记录集 Dy5'm?
1、创建可滚动、更新的Statement z$S)|6Q
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Un7jzAvQ
该Statement取得的ResultSet就是可滚动的 -3F|)qwK
2、创建PreparedStatement时指定参数 ~6E
`6;`
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); #dU-*wmJ
ResultSet.absolute(9000); PT|t6V"wd
批量更新 ]iYjS
1、Statement h=?#D0
Statement sm = cn.createStatement(); -Y;(yTtz
sm.addBatch(sql1); s [@II]
sm.addBatch(sql2); ^!?W!k!:V
... b,~6cDU
sm.executeBatch() O cd
^{u
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 iVwI}%k
2、PreparedStatement x2(hp
PreparedStatement ps = cn.preparedStatement(sql); yB,$4:C
{ <`n T+c
ps.setXXX(1,xxx); xyBWV]Y
... {rf.sN~M
ps.addBatch(); 9qIjs$g
} |3QKxS0
ps.executeBatch(); x^xlH!Sc
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 w%KU@$
Z;-=x p
事务的处理 8<{)|GoqB
1、关闭Connection的自动提交 ~*ST fyFw
cn.setAutoCommit(false); 2E;UHR
2、执行一系列sql语句 7c5+8k3
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Fzt{^%\`
Statement sm ; MB%yC]w8
sm = cn.createStatement(insert into user...); M e_.X_
sm.executeUpdate(); Am{Vtl)i
sm.close(); 'QeCJ5p]
sm = cn.createStatement("insert into corp...); 2mRm.e9?
sm.executeUpdate(); ko2 ?q
sm.close(); sZxf.
3、提交 ..)O/g.
cn.commit(); !EB<e5}8wK
4、如果发生异常,那么回滚 W;P8=q
cn.rollback();