java 数据库基本操作 2BXy<BM @
1、java数据库操作基本流程 k(VB+k"3
2、几个常用的重要技巧: ,5
j"ruZ
可滚动、更新的记录集 Q,T"Zd Q
批量更新 O`1!
事务处理 w4,Ag{t>
gY-5_Ab
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 7r#ymQ
1、取得数据库连接 26?W
nu60
1)用DriverManager取数据库连接 W#fZ1E6
例子 da!P0x9p
String className,url,uid,pwd; 5K%SL1N
className = "oracle.jdbc.driver.OracleDriver"; nuQ]8- ,
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; NE2pL@sk
uid = "system"; pmvT$;7I
pwd = "manager"; ^"\s eS
Class.forName(className); &C<yfRDu
Connection cn = DriverManager.getConnection(url,uid,pwd); jhgX{xc
2)用jndi(java的命名和目录服务)方式 *A 'FC|\
例子 DE$q+j0P
String jndi = "jdbc/db"; R7jmv n
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); >r@.F%
DataSource ds = (DataSource) ctx.lookup(jndi); Bh`N[\r
Connection cn = ds.getConnection(); B;6]NCxD
多用于jsp中 9LnN$e
2、执行sql语句 ;h=*!7:
1)用Statement来执行sql语句 k*rZ*sSp
String sql; `>(W"^
Statement sm = cn.createStatement(); y;cUl, :v
sm.executeQuery(sql); // 执行数据查询语句(select) zdl%iop3e
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); = {'pUU
2)用PreparedStatement来执行sql语句 EI~"L$?
String sql; .jw}JJ
sql = "insert into user (id,name) values (?,?)"; {]*x*aa\
PreparedStatement ps = cn.prepareStatement(sql); _9H*agRe
ps.setInt(1,xxx); 3chPY4~A
ps.setString(2,xxx); (:V>Hjt
... POI.]1i
ResultSet rs = ps.executeQuery(); // 查询 :,12")N
int c = ps.executeUpdate(); // 更新 ]
Wy)
g:l.MJT
3、处理执行结果 g1E~+@
查询语句,返回记录集ResultSet A5:qKaAq
更新语句,返回数字,表示该更新影响的记录数 BaF!O5M
ResultSet的方法 f"u*D,/sS
1、next(),将游标往后移动一行,如果成功返回true;否则返回false <:>SGSE9
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 >I
}TQ{`a@
4、释放连接 >Hb^P)3
cn.close(); KOq;jH{$
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection lASL8O&\
n]_[NR) i
可滚动、更新的记录集 UV
4>N
1、创建可滚动、更新的Statement RgdysyB
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); YpAg
该Statement取得的ResultSet就是可滚动的 |'ln?D:&
2、创建PreparedStatement时指定参数 n6d9\
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); V"o7jsFH6n
ResultSet.absolute(9000); Jf)bHjC_V
批量更新 u=F+(NE"
1、Statement \6?A!w~6
Statement sm = cn.createStatement(); #o/H~Iv
sm.addBatch(sql1); 5Z/GK2[HL
sm.addBatch(sql2); hRI"y":zD
... >7`<!YJkK
sm.executeBatch() =o}"jVE
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 nMfFH[I4
2、PreparedStatement /v|"0
PreparedStatement ps = cn.preparedStatement(sql); 1(Y7mM8\
{ m"\:o
ps.setXXX(1,xxx); .o1^Oh
... B&+`)E{KB
ps.addBatch(); Yb i%od&
} OJN2z
ps.executeBatch(); 5
8-e^.
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 f %lD08Sl
S d/?&
事务的处理 EpS(o>'
1、关闭Connection的自动提交 jc[_I&Oc_
cn.setAutoCommit(false); 8[CB>-9
2、执行一系列sql语句 $8USyGi3J
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close m=AqV:%|
Statement sm ; X{n- N5*
sm = cn.createStatement(insert into user...); Ok7t@l$
sm.executeUpdate(); o@]So(9f
sm.close(); o*x*jn:hm
sm = cn.createStatement("insert into corp...); w;}@'GgL
sm.executeUpdate(); `~eX55W
sm.close(); b `2|I {
3、提交 c^rOImZ
cn.commit(); 9=w|)p )
4、如果发生异常,那么回滚 +uWDP.
cn.rollback();