java 数据库基本操作 4&6cDig7*2
1、java数据库操作基本流程 [yRqSB
2、几个常用的重要技巧: lHu/pSu@k
可滚动、更新的记录集 9(bbV5}
批量更新 GW9,%}l^;
事务处理 'n?"f |G
w}29#F\]R
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Q"qJ0f)
1、取得数据库连接 jank<Q&w
1)用DriverManager取数据库连接 U:$`M,762Z
例子 :rvBx"
String className,url,uid,pwd; -{yG+1
className = "oracle.jdbc.driver.OracleDriver"; TNcMrbWA
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; A\ tBmL_s
uid = "system"; ZV07;`I
pwd = "manager"; za8+=?
Class.forName(className); u#->?
Connection cn = DriverManager.getConnection(url,uid,pwd); )EN,Ry
2)用jndi(java的命名和目录服务)方式 26j-1c!NGd
例子 `EiL~*
String jndi = "jdbc/db"; LBcqFvj{&
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 3V]psZS
DataSource ds = (DataSource) ctx.lookup(jndi); ;[|+tO_
Connection cn = ds.getConnection(); {|e7^_ ke
多用于jsp中 ikPr>
2、执行sql语句 J/[PA[Rf
1)用Statement来执行sql语句 UG<<.1JL
String sql; V.o*`V
Statement sm = cn.createStatement(); J!'IkC$>
sm.executeQuery(sql); // 执行数据查询语句(select) >Q)S-4iR
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); **ls 4CE<
2)用PreparedStatement来执行sql语句 zXd#kw;
String sql; YIYuqtnSJ
sql = "insert into user (id,name) values (?,?)"; e"2x!(&n(
PreparedStatement ps = cn.prepareStatement(sql); u5,vchZ
ps.setInt(1,xxx); d-]!aFj|U
ps.setString(2,xxx); =e6!U5
f
... A}1:fw\Fn3
ResultSet rs = ps.executeQuery(); // 查询 (. ,{x)H
int c = ps.executeUpdate(); // 更新 [bN_0T.YI
<H1e+l{8$
3、处理执行结果 X d&oERJj
查询语句,返回记录集ResultSet K%/g!t)
更新语句,返回数字,表示该更新影响的记录数 Ge76/T%{Q
ResultSet的方法 fqol-{F.V
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Ft>,
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 AgdU@&^
ulk yP
4、释放连接 o* QZf*M
cn.close(); u 0 K1n_
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection QW%xwV?8
QX9['B<
可滚动、更新的记录集 QwI HEmdM
1、创建可滚动、更新的Statement "3?:,$*
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); k:1|Z+CJ
该Statement取得的ResultSet就是可滚动的 )/{~&LU
2、创建PreparedStatement时指定参数 A{52T]9X
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 9O:-q[K**
ResultSet.absolute(9000); @t8{pb;v
批量更新 o^BX:\}
1、Statement Vb~;"WABo
Statement sm = cn.createStatement(); VO*fC
sm.addBatch(sql1); ]Vf2Mn=]"
sm.addBatch(sql2); ab<7jfFIa
... 77G4E ,]
sm.executeBatch() Ude)$PAe%
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 1,6Y)_
2、PreparedStatement ?/KkN3Y_j[
PreparedStatement ps = cn.preparedStatement(sql); *@&V=l
{ "6iq_!#L
ps.setXXX(1,xxx); A@ w9_qo
... A2B]E,JMp
ps.addBatch(); +#g4Crb
} x
~@%+d
ps.executeBatch(); sAPYQ
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Ak2Vf0E b
6Kd,(DI
事务的处理 "o<&3c4
1、关闭Connection的自动提交 QST-!`]v
cn.setAutoCommit(false); rVnolA*%
2、执行一系列sql语句 mmEe@-lE
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ~G~:R
Statement sm ; 0"`|f0}c
sm = cn.createStatement(insert into user...); <9?`zo$y
sm.executeUpdate(); 'S;l"
sm.close(); vslN([@JR
sm = cn.createStatement("insert into corp...); iIg99c7/&9
sm.executeUpdate(); ?yvjX90
sm.close(); Fi#b0S
3、提交 U9q6m3#$
cn.commit(); Za1VJ5-
4、如果发生异常,那么回滚 ,j\UZ
cn.rollback();