java 数据库基本操作 BnG{)\s
1、java数据库操作基本流程 EL6<%~,V"I
2、几个常用的重要技巧: W]D+[mpgK
可滚动、更新的记录集 CQA^"Ll
批量更新 id)J;!^;J
事务处理 keJ-ohv)
eI@G B
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 P!!:p2fo
1、取得数据库连接 JHuA}f{2&
1)用DriverManager取数据库连接
r@Xh8
r;
例子 ;+n25_9
String className,url,uid,pwd; S-79uo
className = "oracle.jdbc.driver.OracleDriver"; @2eH;?uO
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; /S9n!H:MT
uid = "system"; &-KQ
m20n
pwd = "manager"; {~V_6wY g
Class.forName(className); X=VaBy4#
Connection cn = DriverManager.getConnection(url,uid,pwd); 4rypT-%^ ;
2)用jndi(java的命名和目录服务)方式 GXR7Ug}k
例子 jF{)2|5
String jndi = "jdbc/db"; U8eU[|-8O/
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); &D` $YUl@
DataSource ds = (DataSource) ctx.lookup(jndi); ]_hXg*?
Connection cn = ds.getConnection(); s5ILl wr
多用于jsp中 nIl<2H]F`
2、执行sql语句 5IP@_GV|
1)用Statement来执行sql语句 {sUc2vR
String sql; Bm;@}Ly=G
Statement sm = cn.createStatement(); ):V)Hrq?x
sm.executeQuery(sql); // 执行数据查询语句(select) P9]95.j
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ^mZTki4
2)用PreparedStatement来执行sql语句 !H4uc
String sql; S/6I9zOP
sql = "insert into user (id,name) values (?,?)"; XRn+6fn|
PreparedStatement ps = cn.prepareStatement(sql); a61?G!]
ps.setInt(1,xxx); Q[bIkvr|
ps.setString(2,xxx); |99Z&
<8f
... 84gj%tw'-
ResultSet rs = ps.executeQuery(); // 查询 Ws[d. El
int c = ps.executeUpdate(); // 更新 _m1WY7
nVk]Qe
3、处理执行结果 PU%WpI.w
查询语句,返回记录集ResultSet {'Gu@l
更新语句,返回数字,表示该更新影响的记录数 J|b:Zo9<f"
ResultSet的方法 >H?~2O
1、next(),将游标往后移动一行,如果成功返回true;否则返回false tmC9p6%
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 &uJ7[m19z
_LLE~nUK"/
4、释放连接 yF1^/y!@
cn.close(); |bmc6G[
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection _aOsFFB1KF
}J:WbIr0!
可滚动、更新的记录集 5G#K)s(QC
1、创建可滚动、更新的Statement @TnAO8Q>XD
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 0>0:ls
该Statement取得的ResultSet就是可滚动的 g%d&>y?1r
2、创建PreparedStatement时指定参数 BYs^?IfW
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); !B&1{
ResultSet.absolute(9000); G/8G`teAZ
批量更新 V__n9L/t
1、Statement wqp(E+&
Statement sm = cn.createStatement(); yGPi9j{QXq
sm.addBatch(sql1); +,}CuF
sm.addBatch(sql2); >V3pYRA
... 4JjO.H
sm.executeBatch() qzu%Pp6If
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 }u'O<d~z?
2、PreparedStatement Uf-`g>
PreparedStatement ps = cn.preparedStatement(sql); DYCXzFAa
{ 1H,hw
ps.setXXX(1,xxx); P
C
... 2n5{H fpY
ps.addBatch(); :6Sb3w5h
} U_e e3KKA
ps.executeBatch(); p%*!]JRS
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 7 m!e\x8
_Y,d|!B#L
事务的处理 evHKq}{
1、关闭Connection的自动提交 wB W]w
cn.setAutoCommit(false); PRF^<%mkI
2、执行一系列sql语句 ~TALpd
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close "G!V?~;
Statement sm ; :#p!&Fi
sm = cn.createStatement(insert into user...); <S
M%M?
sm.executeUpdate(); qxglA*/
[
sm.close(); H>5@/0cL2
sm = cn.createStatement("insert into corp...); K\>CXa
sm.executeUpdate(); ^7%
KS
sm.close(); 8fs::}0
3、提交 %+Khj@aX
cn.commit(); ;/-#oW@gQ
4、如果发生异常,那么回滚 `F1 ( v
cn.rollback();