java 数据库基本操作 m,Os$>{Ok
1、java数据库操作基本流程 YMJ?t"
2、几个常用的重要技巧: I2D<~xP~2+
可滚动、更新的记录集 '|Cs!Zl
批量更新 0gxbo
事务处理 ?e yo2:-$
5q"
;R$+j
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 :0V <
1、取得数据库连接 0hCJovSG%
1)用DriverManager取数据库连接 `y
m^0x8
例子 CkIICx
String className,url,uid,pwd; KeY)%{
className = "oracle.jdbc.driver.OracleDriver"; Nqy',N
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; $Nnz|y
uid = "system"; :Bda]]Y=
pwd = "manager"; ]#_,?d
Class.forName(className); pbAQf3
Connection cn = DriverManager.getConnection(url,uid,pwd); *O+YhoR?
2)用jndi(java的命名和目录服务)方式 ,HR~oT^
例子 x1wm ]|BIf
String jndi = "jdbc/db"; 1 vi<@i,
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 0E{$u
DataSource ds = (DataSource) ctx.lookup(jndi); P|c79
Connection cn = ds.getConnection(); +d]}
多用于jsp中 u|B\@"0
2、执行sql语句 ?GX5Pvg
1)用Statement来执行sql语句 |Q.t]TR'P
String sql; w#]%I+
Statement sm = cn.createStatement(); 6]7iiQz"H
sm.executeQuery(sql); // 执行数据查询语句(select) .#Z}}W#
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ^D"}OQoh
2)用PreparedStatement来执行sql语句 s+^YGB
String sql; mJ[LmQ<:
sql = "insert into user (id,name) values (?,?)"; 'V .4Nhd
PreparedStatement ps = cn.prepareStatement(sql); $d4eGL2S
ps.setInt(1,xxx); ^[lg1uMW
ps.setString(2,xxx); _qM'm^z5
... ;?bRRW
ResultSet rs = ps.executeQuery(); // 查询 *p p1U>,
int c = ps.executeUpdate(); // 更新 eQJLyeR+
&A]*"lt|w
3、处理执行结果 J3g>#N]='(
查询语句,返回记录集ResultSet V_(lZDjh*
更新语句,返回数字,表示该更新影响的记录数 -N~*h
ResultSet的方法 NZmmO )p4
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 8kX3.X`
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ^`Vt<DMT
~1i,R1_\Y
4、释放连接 8&f}GdZh
cn.close(); +u:8#!X$RD
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 'l)@MXbGL
I
Yj\t?,0
可滚动、更新的记录集 FK;\Nce&
1、创建可滚动、更新的Statement x]J{EA{+
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); _hK7hvM>
该Statement取得的ResultSet就是可滚动的 o~ 2bk<]z
2、创建PreparedStatement时指定参数 +.mIC:9
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); fw'$HV76
ResultSet.absolute(9000); NhS0D=v6
批量更新 ~`u?|+*BO
1、Statement m},nKsO
Statement sm = cn.createStatement(); wnN@aO6g*
sm.addBatch(sql1); 9c4 6|
sm.addBatch(sql2); dGrOw)
... 5d<-y2!M
sm.executeBatch() coiTVDwA
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 j"yL6Q9P
2、PreparedStatement v5RS <?o
PreparedStatement ps = cn.preparedStatement(sql); _LxV)
{ Yk6fr~b
ps.setXXX(1,xxx); 's(0>i
... <~<I K=n
ps.addBatch(); aG?'F`UQ
} 0&$e:O'v
ps.executeBatch(); &7XB$
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 #AFr@n
0+m"eGwTm
事务的处理 (<=qW_iW
1、关闭Connection的自动提交 lD _
u
cn.setAutoCommit(false); 'w^1re=R
2、执行一系列sql语句 {M$mrmG
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close LdDkd(k
Statement sm ; DbH{;
Fb
sm = cn.createStatement(insert into user...); u3dh MnUn
sm.executeUpdate(); AW!|xA6'`:
sm.close(); gXE'3
sm = cn.createStatement("insert into corp...); >rB7ms/@E
sm.executeUpdate(); f8B*D4R}
sm.close(); 2u~0B +)K/
3、提交 UW. F1)
cn.commit(); vx5;}[Bhm
4、如果发生异常,那么回滚 x{&0:|bCs6
cn.rollback();