java 数据库基本操作 P>kx{^
1、java数据库操作基本流程 B>mQ\Q
2、几个常用的重要技巧: 3TtW2h>M
可滚动、更新的记录集 C;ye%&g>
批量更新 Xo5L:(?K
事务处理 i,HAXPi
,@;<u'1\G
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 [y:LA~q
1、取得数据库连接 \'KzSkC8
1)用DriverManager取数据库连接 QezK&iJg
例子 L!G3u/
String className,url,uid,pwd; zN:752d^+r
className = "oracle.jdbc.driver.OracleDriver"; Cf N; `
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; <>Im$N ai
uid = "system"; ,rdM{ r
pwd = "manager"; G~]BC#nB_
Class.forName(className); 3/e !7
Connection cn = DriverManager.getConnection(url,uid,pwd); 1%+^SR72
2)用jndi(java的命名和目录服务)方式 YH>n{o;-
?
例子 tc',c},h~,
String jndi = "jdbc/db";
:+=*
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); IviWS84
DataSource ds = (DataSource) ctx.lookup(jndi); !:8!\gE^P
Connection cn = ds.getConnection(); 6\K)\
多用于jsp中 *+z({S_Nv
2、执行sql语句 N#:"X;
1)用Statement来执行sql语句 gc=e)j@
String sql; \2`U$3Q
Statement sm = cn.createStatement(); u&Fm}/x
sm.executeQuery(sql); // 执行数据查询语句(select) lrzW H0Q
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 3{l"E(qqZ
2)用PreparedStatement来执行sql语句 0{yx*}.
String sql; iI1t
P
sql = "insert into user (id,name) values (?,?)"; Ame%:K!t
PreparedStatement ps = cn.prepareStatement(sql);
_6' g]4
ps.setInt(1,xxx); b+hY^$//
ps.setString(2,xxx); &M!:,B
... Q'VS]n
ResultSet rs = ps.executeQuery(); // 查询 8\9EDgT
int c = ps.executeUpdate(); // 更新 7,zARWB!?
On^#x]
3、处理执行结果 8{YxUD
查询语句,返回记录集ResultSet V("1\
更新语句,返回数字,表示该更新影响的记录数 _biJch
ResultSet的方法 D/WS
1、next(),将游标往后移动一行,如果成功返回true;否则返回false {JgN^R<5<f
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Z:_y,( 1Q
?zEF?LJoK
4、释放连接 (AYD@
cn.close(); 4=Ey\Px
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection dq(x@&J
H.L@]~AyL
可滚动、更新的记录集 `{Jb{L@f
1、创建可滚动、更新的Statement 7yp*I[1Qf>
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); $#r(1 Ev
该Statement取得的ResultSet就是可滚动的 1N+#(<x@,
2、创建PreparedStatement时指定参数 ^n/uY94E)p
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); =+p+_}C
ResultSet.absolute(9000); BR2y1Hfi
批量更新 J.nq[/Q=
1、Statement z@i4dC
Statement sm = cn.createStatement(); Q\76jD`m\
sm.addBatch(sql1); iIFQRnpu;3
sm.addBatch(sql2); f#5JAR
... 8=~>B@'
sm.executeBatch() ShpnFuH
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 lI 1lP 1
2、PreparedStatement o1Ln7r.
PreparedStatement ps = cn.preparedStatement(sql); zTLn*?
{ Pcs@`&}7r
ps.setXXX(1,xxx); Q-v[O4y~
... lND[anB!
ps.addBatch(); T8-$[
2
} :3f2^(b~^
ps.executeBatch(); 0, /x#
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 &iZYBa
"tM/`:Qp
事务的处理 Be+:-t)
1、关闭Connection的自动提交 \0h/~3
cn.setAutoCommit(false); kP$gl|
2、执行一系列sql语句 37xxVbik
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close kg@h R}
Statement sm ; [JoTWouNU
sm = cn.createStatement(insert into user...); WFP\;(YV
sm.executeUpdate(); h86={@Le
sm.close(); w|C~{
sm = cn.createStatement("insert into corp...); aB^G
sm.executeUpdate(); t5h_Q92N
sm.close();
Z<W6Avr
3、提交 ^A`(
cn.commit(); 5H+k_U
4、如果发生异常,那么回滚 keskD
cn.rollback();