java 数据库基本操作 8U{D)KgS
1、java数据库操作基本流程 &W<7!U:2m
2、几个常用的重要技巧: [M|^e;tWK
可滚动、更新的记录集 6h:QSVfx
批量更新 n
Bu!2c
事务处理 ?@64gdlwq
OH`a3E{e
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 \6b~$\~B
1、取得数据库连接 `|t,Uc|7!
1)用DriverManager取数据库连接 k&Pt\- 9on
例子 cx\"r
String className,url,uid,pwd; .;? Bni
className = "oracle.jdbc.driver.OracleDriver"; {U5sRM|I
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; pBsb>wvej
uid = "system"; e"
v%m'G
pwd = "manager"; i5e10@Q{
Class.forName(className); o E+'@
Connection cn = DriverManager.getConnection(url,uid,pwd); q<YM,%mgj
2)用jndi(java的命名和目录服务)方式 B%F]K<
例子 L}Z.FqJ
String jndi = "jdbc/db"; *$Q>Om]
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); iq&3S 0
DataSource ds = (DataSource) ctx.lookup(jndi); 6= ?0&Bx&
Connection cn = ds.getConnection(); ;_}pIO
多用于jsp中 8lyIL^
2、执行sql语句 5y#,z`S
1)用Statement来执行sql语句 E_,/)U8
String sql; *^?tr?e%I<
Statement sm = cn.createStatement(); xT*'p&ap
sm.executeQuery(sql); // 执行数据查询语句(select) vq$6e*A
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); `PWKA;W$0
2)用PreparedStatement来执行sql语句 yV^Yp=f_
String sql; 4]d^L>
sql = "insert into user (id,name) values (?,?)"; @*;x1A-]V
PreparedStatement ps = cn.prepareStatement(sql); wkg4I.
ps.setInt(1,xxx); |#Gxqq'
ps.setString(2,xxx); -gn0@hS0
... !=9x=
ResultSet rs = ps.executeQuery(); // 查询 so-5%S
int c = ps.executeUpdate(); // 更新 'Ru(`"
1|
qCs/sW
3、处理执行结果 I%T+H[,
查询语句,返回记录集ResultSet pbMANZU[
更新语句,返回数字,表示该更新影响的记录数 (,Y[2_Zv
ResultSet的方法 l}nV WuD
1、next(),将游标往后移动一行,如果成功返回true;否则返回false (i&+= +"wn
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 "x,lL
8ro`lX*F@2
4、释放连接 JE.$]){
cn.close(); $AK
^E6
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection H%_^Gy8f
q"d9C)Md
可滚动、更新的记录集 8hGyh#
1、创建可滚动、更新的Statement y_X6{}Ke
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); oz!)x\m*H
该Statement取得的ResultSet就是可滚动的 `z!AjAT-G
2、创建PreparedStatement时指定参数 z'L0YqXG/
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ~Ntk-p
ResultSet.absolute(9000); T3w%y`K
批量更新 _){|/Zd
1、Statement g/GI'8EMj
Statement sm = cn.createStatement(); y0%@^^-Ru
sm.addBatch(sql1); } z'Jsy[s
sm.addBatch(sql2); [LVXXjkFI
... |$WHw*F^
sm.executeBatch() 9*"
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 -]3 K#M)s
2、PreparedStatement (HNc9QVC'W
PreparedStatement ps = cn.preparedStatement(sql); Mc,79Ix"
{ x@#>l8k?
ps.setXXX(1,xxx); ?2@^O=I
... jWdviS9&g
ps.addBatch(); ] \yIHdcDi
} Ib(C`4%
ps.executeBatch(); ;c 7I "?@z
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 prJd'
ne#dEUD
事务的处理 '|C%X7
1、关闭Connection的自动提交 J(1Tl
cn.setAutoCommit(false); (-C)A-Uo&
2、执行一系列sql语句 A 3 V
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 54$^ldD
Statement sm ; u]ms~rO
sm = cn.createStatement(insert into user...); M5bE5C
sm.executeUpdate(); d9{lj(2P
sm.close(); r-qe7K@p
sm = cn.createStatement("insert into corp...); _zj^k$ j
sm.executeUpdate(); ((M,6Q}
sm.close(); b(K"CL\p
3、提交 /k.0gYD
cn.commit(); E'6>3n
4、如果发生异常,那么回滚 "L>'X22ed
cn.rollback();