java 数据库基本操作 bU \T
1、java数据库操作基本流程 Hqtv`3g
2、几个常用的重要技巧: )(9[> _+40
可滚动、更新的记录集 Ft^X[5G4L
批量更新 Jcy+(7lE)
事务处理 fg7
7|xu)zYB
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Zts1BWL[
1、取得数据库连接 1N[9\Yi
1)用DriverManager取数据库连接 Y(u`K=*
例子 9;Q|"
T
String className,url,uid,pwd; *xjP^y":
className = "oracle.jdbc.driver.OracleDriver"; O!ilTMr
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr;
nDS\2
uid = "system"; v@4vitbG9
pwd = "manager"; :='I>Gn
Class.forName(className); yl&s!I
Connection cn = DriverManager.getConnection(url,uid,pwd); "ql$Rz8
2)用jndi(java的命名和目录服务)方式 o%!s/Z1
例子 naM~>N
String jndi = "jdbc/db"; ~s
yWORiXm
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); aL*}@|JL"
DataSource ds = (DataSource) ctx.lookup(jndi); OIK46D6?.
Connection cn = ds.getConnection(); 0NK|3]p
多用于jsp中 ~Ajst!Y7=
2、执行sql语句 GYg.B<Q.
1)用Statement来执行sql语句 ({zWyl
String sql; UxxX8N
Statement sm = cn.createStatement(); cm0$v8
sm.executeQuery(sql); // 执行数据查询语句(select) @+0dgkJ
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); -
~4na{6x
2)用PreparedStatement来执行sql语句 =W&m{F96
String sql; D|amKW7
sql = "insert into user (id,name) values (?,?)"; z9!OzGtIR
PreparedStatement ps = cn.prepareStatement(sql); .C.b5x!
ps.setInt(1,xxx); _K&Hiz/'
ps.setString(2,xxx); .4ZOm'ko{
... )~Gn7
ResultSet rs = ps.executeQuery(); // 查询 k }{o:
N
int c = ps.executeUpdate(); // 更新 JVGTmS[3
?6]B6
3、处理执行结果 ~%2yDhdQ
查询语句,返回记录集ResultSet +MD84YR
更新语句,返回数字,表示该更新影响的记录数 p6aR/gFkqv
ResultSet的方法 sH>`eqY
1、next(),将游标往后移动一行,如果成功返回true;否则返回false puLgc$?
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Fv*QcB9K
_%er,Ed
4、释放连接 S dN&%(ZE
cn.close(); EDuH+/:n
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection @q`T#vd
5dhy80|g]
可滚动、更新的记录集 6i%6u=um3
1、创建可滚动、更新的Statement ,
@!X!L
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); VR .t
该Statement取得的ResultSet就是可滚动的
2;j<{'
2、创建PreparedStatement时指定参数 9 *uK]/c
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); w3 kkam"
ResultSet.absolute(9000); vaJl}^T
批量更新 mP=[h
|a$r
1、Statement xjSzQ|k-
Statement sm = cn.createStatement(); lT*@f39~g
sm.addBatch(sql1); ][b|^V
sm.addBatch(sql2); '9=b@SaAj
... \#xq$ygg
sm.executeBatch() Qwt0~9n(
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ZJenwo
2、PreparedStatement
x.4z)2MO
PreparedStatement ps = cn.preparedStatement(sql); 4U_+NC>b
{ 73]8NVm
ps.setXXX(1,xxx); F+GX{e7E\
... /G|v.#2/g
ps.addBatch(); }O>4XFj
} 4lWqQVx
ps.executeBatch(); "M@&*<S
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ,Tu.cg
8{QCW{K
事务的处理 I 44]W &
1、关闭Connection的自动提交 i]N<xcF9N*
cn.setAutoCommit(false); 3y+~l
H:
2、执行一系列sql语句 Ep;i],}
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close gL-kI*Ra
Statement sm ; ]8fn1Hx\
sm = cn.createStatement(insert into user...); o&&`_"18
sm.executeUpdate(); ^EKRbPA9:<
sm.close(); qH5nw}]
sm = cn.createStatement("insert into corp...); iC5HrOl6U
sm.executeUpdate(); .drY
sm.close(); J
<;xkT1x
3、提交 iCA-X\E
cn.commit(); lVQE}gd%m
4、如果发生异常,那么回滚 39hep8+
cn.rollback();