java 数据库基本操作 K\5@yqy5
1、java数据库操作基本流程 u
z4P
2、几个常用的重要技巧: m:)v>v u
可滚动、更新的记录集 DZilK:
批量更新 "S_t%m&R
事务处理 ygWo9?
oOmPbAY
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 qOV#$dkY
1、取得数据库连接 ,N?~je.
1)用DriverManager取数据库连接 #fRhG^QKp
例子 4nXS}bW f
String className,url,uid,pwd; 3!,XR\`[
className = "oracle.jdbc.driver.OracleDriver"; }R;.~F
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 3/@7$nV
uid = "system"; bQrH8)
pwd = "manager"; ]j~V01p/e
Class.forName(className); 5|9,S
Connection cn = DriverManager.getConnection(url,uid,pwd); SLD%8:Zn
2)用jndi(java的命名和目录服务)方式 ]xCJ3.9
例子 7Xw;TA
String jndi = "jdbc/db"; O0i_h<T
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); _K_!(]t
DataSource ds = (DataSource) ctx.lookup(jndi); >hJ$~4?
Connection cn = ds.getConnection(); m3+MRy5
多用于jsp中 ~kD/dXt
2、执行sql语句 }'b3'/MJ
1)用Statement来执行sql语句 SirjWYap
String sql; nws '%MK)
Statement sm = cn.createStatement(); %r=uS.+hrF
sm.executeQuery(sql); // 执行数据查询语句(select) A{bt
Z#k
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); F@& R"-
2)用PreparedStatement来执行sql语句 .;yy=
Rj
String sql; 8
!Pk1P
sql = "insert into user (id,name) values (?,?)"; &I
Iw>,,
PreparedStatement ps = cn.prepareStatement(sql); kT@RA}
ps.setInt(1,xxx); (f#QETiV
ps.setString(2,xxx); LTj;e[
... ]:i
:QiYD
ResultSet rs = ps.executeQuery(); // 查询 )f-u x5
int c = ps.executeUpdate(); // 更新 z~Ph=1O>p
sDT(3{)L7
3、处理执行结果 5 WSu
查询语句,返回记录集ResultSet b#bdz1@s
更新语句,返回数字,表示该更新影响的记录数 cTu7U=%
ResultSet的方法 daf$`
1、next(),将游标往后移动一行,如果成功返回true;否则返回false py`RH)
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 sP$bp Z}
G;_QE<V~_
4、释放连接 k@JDG]R<{
cn.close(); u.*@lGVW
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection |={><0
,cPNZ-%
可滚动、更新的记录集 }$!bD
1、创建可滚动、更新的Statement jXvGL
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); N(>a-a
该Statement取得的ResultSet就是可滚动的 Bzn{~&i?W:
2、创建PreparedStatement时指定参数 2|@@xF
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ?z% @;&
ResultSet.absolute(9000); x- kCNy
批量更新 Mnyg:y*=
1、Statement [H;HrwM
s)
Statement sm = cn.createStatement(); (__=*ew
sm.addBatch(sql1); 8*kZ.-T
B
sm.addBatch(sql2); 4[a?..X
... .Gq.s t%
sm.executeBatch() TU$PAwn=
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 qH!}oPeU'
2、PreparedStatement '$pT:4EuGq
PreparedStatement ps = cn.preparedStatement(sql); J01w\#62pQ
{ r/1:!Vu(
ps.setXXX(1,xxx); dl;~-'0
... $fhrGe
ps.addBatch(); #P *%FgROl
} S>}jsP:V
ps.executeBatch(); 0}Rxe
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 *k==2figz
g]85[xz
事务的处理 )hmU/E@
1、关闭Connection的自动提交 geU-T\1[l
cn.setAutoCommit(false); i3t=4[~oL
2、执行一系列sql语句 ozH7c_ <
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close W)JUMW2|
Statement sm ; 4O_z|K_k|
sm = cn.createStatement(insert into user...); r_p9YS@I
sm.executeUpdate(); r9z_8#cR
sm.close(); 6~zR(HzV{
sm = cn.createStatement("insert into corp...); ,\!4A
sm.executeUpdate(); 7IW:,=Zk8+
sm.close(); ;'l Hw]}O*
3、提交 pxjN\q
cn.commit(); 5x?eun
4、如果发生异常,那么回滚 (UDF^
cn.rollback();