java 数据库基本操作 c$fi3O
1、java数据库操作基本流程 B6qM0QW
2、几个常用的重要技巧: yR}PC/>
可滚动、更新的记录集 F9h'.{@d
批量更新 [=/Yo1:v
事务处理 n/]w!
X~+AaI:~K
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 d6RO2^
1、取得数据库连接 (S<Z@y+d
1)用DriverManager取数据库连接 d}B_ wz'
例子 *49({TD6`
String className,url,uid,pwd; !W\Zq+^^J3
className = "oracle.jdbc.driver.OracleDriver"; @bfW-\ I
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; s0D,n1x
uid = "system"; U-h'a:
K
pwd = "manager"; Q5K<ECoPk
Class.forName(className); Jeb"t1.$
Connection cn = DriverManager.getConnection(url,uid,pwd); ]\TYVv)
2)用jndi(java的命名和目录服务)方式 7tZvz `\
例子 x{'3eJ^8
String jndi = "jdbc/db"; *;N6S~_'Y
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); >{/As][
DataSource ds = (DataSource) ctx.lookup(jndi); ioJ~k[T
Connection cn = ds.getConnection(); XEX."y
多用于jsp中 O8\> ?4)
2、执行sql语句 4k7
LM]
1)用Statement来执行sql语句 O4c[,Uq8~
String sql; D6Q6yNE
Statement sm = cn.createStatement(); ='rSB.$Ctk
sm.executeQuery(sql); // 执行数据查询语句(select) xbTvv>'U
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); M'(4{4rC
2)用PreparedStatement来执行sql语句 *- S/{
.&
String sql;
xY_<D+OV
sql = "insert into user (id,name) values (?,?)"; T> < Vw
PreparedStatement ps = cn.prepareStatement(sql); th
:I31
ps.setInt(1,xxx); '!V5 #J
ps.setString(2,xxx); V
eD<1<
... B)L=)N
ResultSet rs = ps.executeQuery(); // 查询 ^i;y2c
int c = ps.executeUpdate(); // 更新 jsp)e=
\gU=B|W
3、处理执行结果 -O~V4004
查询语句,返回记录集ResultSet >du _/*8:
更新语句,返回数字,表示该更新影响的记录数 W]TO%x{
ResultSet的方法 <w1#3Mu'
1、next(),将游标往后移动一行,如果成功返回true;否则返回false (>)f#t[9J
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 bdxmJ9a:R
VX'cFqrK3
4、释放连接 <T^:`p/]4
cn.close(); ^.Xom~
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ZC!GKWP2
mh$ Nwr/W:
可滚动、更新的记录集 +k?0C?/T;
1、创建可滚动、更新的Statement RZL:k;}5
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); =rL^^MZp
该Statement取得的ResultSet就是可滚动的 l2.Lh<G
2、创建PreparedStatement时指定参数 Shag4-*@hi
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); KD(}-zUs
ResultSet.absolute(9000); S-Z s
批量更新 0*4h}t9j
1、Statement _Pe,84Ro
Statement sm = cn.createStatement(); Vmb `%k20'
sm.addBatch(sql1); J;R1OJs S
sm.addBatch(sql2); ^{l^Z
+b.
... j~#nJI5]
sm.executeBatch() ?c7}
v
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 i,R+C.6{
2、PreparedStatement FHv^^u'@
PreparedStatement ps = cn.preparedStatement(sql); +`p@md2L1
{ Jmcf9g
ps.setXXX(1,xxx); $p?TE8G
... ]N#%exBVo
ps.addBatch(); @TqqF:c7
} E4;@P']`
ps.executeBatch(); $KAOJc4<
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 3{/Y&/\"'^
Ug~]!L
事务的处理 ]A]EED.ZH
1、关闭Connection的自动提交 Kc,=J?Ob
cn.setAutoCommit(false); P)9$}9i
2、执行一系列sql语句 BJ$\Mb##3@
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close PQJI~u9te}
Statement sm ; x<lY&KQ0
sm = cn.createStatement(insert into user...); a%igc^GS2
sm.executeUpdate(); 9`8D Ga
sm.close(); wiE'6CM
sm = cn.createStatement("insert into corp...); -w3KBlo
sm.executeUpdate(); 9% wVE]
sm.close(); ) Z^b)KAk
3、提交 s/cclFji]
cn.commit(); w1 5QqhlK
4、如果发生异常,那么回滚 y2=`NG=
cn.rollback();