java 数据库基本操作 Th4}$)yrkN
1、java数据库操作基本流程 Ym2Ac>I4
2、几个常用的重要技巧: A2.4#Qb'
可滚动、更新的记录集 \)W Z D
批量更新 zek>]l`!
事务处理 oAvLSFn
Ob]J!.
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ()<?^lr33
1、取得数据库连接 r+tHVh
1)用DriverManager取数据库连接 [buLo*C4:
例子 $p*.[)
String className,url,uid,pwd; `2y?(BJp
className = "oracle.jdbc.driver.OracleDriver"; ~6{U^3
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; gCbS$Pw
uid = "system"; sIRfC<
/P
pwd = "manager"; )GOio+{H
Class.forName(className); =+H,}
Connection cn = DriverManager.getConnection(url,uid,pwd); Dy{lgT 0k
2)用jndi(java的命名和目录服务)方式 ^ZFK:|Ju
例子 f,Am;:\ |
String jndi = "jdbc/db"; s<5P sR
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ViU5l*n;
DataSource ds = (DataSource) ctx.lookup(jndi); <:!:7
Connection cn = ds.getConnection(); PmtXD6p3(
多用于jsp中 Lc(eY{CY
2、执行sql语句 [{zfI`6
1)用Statement来执行sql语句 BY@l:y4
String sql; Yi <1z:\
Statement sm = cn.createStatement(); (^58$IW71
sm.executeQuery(sql); // 执行数据查询语句(select) zX6Q7Bc
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 4r#4h4`y|
2)用PreparedStatement来执行sql语句 [J55%N;#1
String sql; TV/ EC#48
sql = "insert into user (id,name) values (?,?)"; <KX+j,4
PreparedStatement ps = cn.prepareStatement(sql); /)sP<WPQ6
ps.setInt(1,xxx); F6_en z
ps.setString(2,xxx); '_ys4hz}
... H`jnChD:M'
ResultSet rs = ps.executeQuery(); // 查询 B/Ltb^a
int c = ps.executeUpdate(); // 更新 s0DT1s&
'f8'|o)
3、处理执行结果 ;_0frX
查询语句,返回记录集ResultSet $y%IM`/w
更新语句,返回数字,表示该更新影响的记录数 GE=PaYz
ResultSet的方法 "d2JNFIHb
1、next(),将游标往后移动一行,如果成功返回true;否则返回false u,]qrlx{
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 :Xu9`5
gP>W* ]0r1
4、释放连接 lBudC
cn.close(); z6|kEc"{
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection YUTI)&y
+K,T^<F;
可滚动、更新的记录集 7tne/Yz
1、创建可滚动、更新的Statement szD9z{9"y
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY);
Az/B/BLB
该Statement取得的ResultSet就是可滚动的 g*!1S
2、创建PreparedStatement时指定参数 Bve',.xH
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); tjQ6[`
ResultSet.absolute(9000); dV
/Es
批量更新 .UvDew/Y
1、Statement ,:0!+1
Statement sm = cn.createStatement(); szXqJG8|
sm.addBatch(sql1); I A$=
sm.addBatch(sql2); z
G`|)
... V`G^Jyj
sm.executeBatch() '=J|IN7WT
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 P1|3%#c
2、PreparedStatement 9<o*aFgCa
PreparedStatement ps = cn.preparedStatement(sql); V7B%o:FZo
{ h~O^~"jc
ps.setXXX(1,xxx); WA.c.{w\
... .vd*~U"
ps.addBatch(); %AA-G
} 5Ha(i [d
ps.executeBatch(); V7D<'!
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 *;Za))
uUe#+[bD
事务的处理 Ao@WTs9
1、关闭Connection的自动提交 _|#P~Ft
cn.setAutoCommit(false); m= %KaRI
2、执行一系列sql语句 +o35${
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close !Z0S@]C
Statement sm ; )S}.QrG
sm = cn.createStatement(insert into user...); Q]OR0-6<.
sm.executeUpdate(); WkV0,_(P
sm.close(); ft~QVe!
sm = cn.createStatement("insert into corp...); 'r1X6?dJ
sm.executeUpdate(); :_Iz(
2hV
sm.close(); X.ZG-TC
3、提交 iO$ ?No
cn.commit(); [7 t
4、如果发生异常,那么回滚 C8=r sh
cn.rollback();