java 数据库基本操作 ;hz"`{(JY
1、java数据库操作基本流程 {CM%QMM
2、几个常用的重要技巧: ZqHh$QBD
9
可滚动、更新的记录集 +1Ha,Ok
批量更新 3le/(=&1
事务处理 ,!BiB*
h\k!X/
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 GoI3hp(
1、取得数据库连接 ]bG8DEwD
1)用DriverManager取数据库连接 `zNvZm -E
例子 p!MOp-;-
String className,url,uid,pwd; }xx[=t=nUf
className = "oracle.jdbc.driver.OracleDriver"; IS`1}i$1%
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; {%$eq{~m
uid = "system"; xF'9`y^]!@
pwd = "manager"; FqOV/B
/z2
Class.forName(className); Y|t] bb
Connection cn = DriverManager.getConnection(url,uid,pwd); /lKgaq.
2)用jndi(java的命名和目录服务)方式 ^mLZT*
例子 !@9Vq6
String jndi = "jdbc/db"; d&:ABI
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ~VZ)LQ'7
DataSource ds = (DataSource) ctx.lookup(jndi); Ux~rBv''
Connection cn = ds.getConnection(); f?wn;;z`
多用于jsp中 j$ h.V#1z
2、执行sql语句 sT"U}
1)用Statement来执行sql语句 %t&n%dhJ
String sql; !7MC[z(|N
Statement sm = cn.createStatement(); YN1P9j#0d
sm.executeQuery(sql); // 执行数据查询语句(select) +'9l 2DI;
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); q<L>r?T[
2)用PreparedStatement来执行sql语句 HtUFl
String sql; -hav/7g
sql = "insert into user (id,name) values (?,?)"; | I_,;c
PreparedStatement ps = cn.prepareStatement(sql); <KF|QE
ps.setInt(1,xxx); %oasIiO
ps.setString(2,xxx); 'u }|~u?m
... ;iJ*.wVq
ResultSet rs = ps.executeQuery(); // 查询 5CZii=@
int c = ps.executeUpdate(); // 更新 e"u=4nk
WQ/H8rOs
3、处理执行结果 {=WTAgP
查询语句,返回记录集ResultSet CzKU;~D=B
更新语句,返回数字,表示该更新影响的记录数 *f8;#.Re
ResultSet的方法 UD|Qa
1、next(),将游标往后移动一行,如果成功返回true;否则返回false q-%;~LF
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 HS"E3s8
d'~
k f#
4、释放连接 0z@KkU{Z
cn.close(); a%"mgCB
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection '!*,JG5_
.lVC>UT
可滚动、更新的记录集 jM8e2z3
1、创建可滚动、更新的Statement lwEJ)Bv
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 99%oY
该Statement取得的ResultSet就是可滚动的 A;nrr1-0
2、创建PreparedStatement时指定参数 5mwtlC':l?
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); :kUZNw'Bi
ResultSet.absolute(9000); vtyk\e)
批量更新 g9>
0N#<
1、Statement V)M+dhl
Statement sm = cn.createStatement(); Q}p+/-U\
sm.addBatch(sql1); }D_h*9
sm.addBatch(sql2); ~|e?@3_G
... RG [*:ReB9
sm.executeBatch() \ct) /
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 @= f2\hU
2、PreparedStatement ~^((tT
PreparedStatement ps = cn.preparedStatement(sql); LAG*H
{ L&O!"[++
ps.setXXX(1,xxx); Az.(tJ X"
... 5z8CUDt
0
ps.addBatch(); zr~hGhfq
} '_& Xemz
ps.executeBatch(); q<mDs$^K
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 /t=R~BJu
)N`a4p
事务的处理 uK6`3lCD
1、关闭Connection的自动提交 xc[LbaBG
cn.setAutoCommit(false); pPt7M'uL"
2、执行一系列sql语句 %n-:mSus
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ]-d:wEj
Statement sm ; UR|UGldt_T
sm = cn.createStatement(insert into user...); hGmJG,H
sm.executeUpdate(); (q'w"q j
sm.close(); KE3/sw0
sm = cn.createStatement("insert into corp...); XQAdb"`
sm.executeUpdate(); tZlz0BY!
sm.close(); *RugVH4
3、提交 M)t d%<_
cn.commit(); T|o[! @:,
4、如果发生异常,那么回滚 &z[39Q{~
cn.rollback();