java 数据库基本操作 3xxQL,FV
1、java数据库操作基本流程 --d<s
2、几个常用的重要技巧: hF s:9
可滚动、更新的记录集 01g=Cg
批量更新 >N@tInE
事务处理 {UX?z?0T
/1F%w8Iqh
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 %I9{)'+@x
1、取得数据库连接 X|q&0W=
1)用DriverManager取数据库连接 rIH/<@+
例子 'C8VD+p
String className,url,uid,pwd; [mn@/qf
className = "oracle.jdbc.driver.OracleDriver"; AqB5B5}
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; WjW+EF8(
uid = "system"; 0^az<!!O#
pwd = "manager"; :tp2@*]9Z
Class.forName(className); D*6v.`]X
Connection cn = DriverManager.getConnection(url,uid,pwd); mcy\nAf5%
2)用jndi(java的命名和目录服务)方式 L3JFQc/oh~
例子 +>/ariRr
String jndi = "jdbc/db"; rdhK&5x*
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); =dx!R ,Bw
DataSource ds = (DataSource) ctx.lookup(jndi); _Db=I3.HJ
Connection cn = ds.getConnection(); CL.JalR`b
多用于jsp中 K#rfQ0QK/!
2、执行sql语句 K*&M:u6E
1)用Statement来执行sql语句 Py$Q]s?\1
String sql; eqU2>bIf
Statement sm = cn.createStatement(); VR ^qwS/
sm.executeQuery(sql); // 执行数据查询语句(select) f.JZ[+
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); /:3:Ky3
2)用PreparedStatement来执行sql语句 0?KXQD
String sql; -G e5gQ=
sql = "insert into user (id,name) values (?,?)"; n0F.Um
PreparedStatement ps = cn.prepareStatement(sql); FRd!UqMXY
ps.setInt(1,xxx); {e\Pd!D?|
ps.setString(2,xxx); SNV~;@(h
... )Fx"S.Ok
ResultSet rs = ps.executeQuery(); // 查询 9] fhH
int c = ps.executeUpdate(); // 更新 reR ><p
C,~wmS )@
3、处理执行结果 1j0OV9 -|
查询语句,返回记录集ResultSet {STOWuY
更新语句,返回数字,表示该更新影响的记录数 h[#Lg3
ResultSet的方法 i]J*lM7'
1、next(),将游标往后移动一行,如果成功返回true;否则返回false R*a5bKr
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 d9>*a$x;/
k"D6Vyy`
4、释放连接 5Ds/^fA
cn.close(); 0D/u`-
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 'KB\K)cD=3
6zh<PETa03
可滚动、更新的记录集 lffp\v{w
1、创建可滚动、更新的Statement ZUP\)[~
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); M #'br<]
该Statement取得的ResultSet就是可滚动的 x;)bp7
2、创建PreparedStatement时指定参数 L9Sd4L_e
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); W2/FGJD
ResultSet.absolute(9000); 0T7(c-
批量更新 !Ob
1、Statement %a=K:" oU[
Statement sm = cn.createStatement(); I$/*Pt];
sm.addBatch(sql1); HM57b>6
sm.addBatch(sql2); 1+6:K._C(m
... JTK>[|c9oE
sm.executeBatch() *p:`F:
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 .Uq?SmK
2、PreparedStatement b~X^vXIv%%
PreparedStatement ps = cn.preparedStatement(sql); e8g"QDc
{ @ODwO;_R5
ps.setXXX(1,xxx); E
.^5N~.
... f2Zi.?``H
ps.addBatch(); 28FC@&'H
} cKuU#&FaV
ps.executeBatch(); kR$>G2$!
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Wt5x*p-!C
0zm)MSg
事务的处理
R)i
1、关闭Connection的自动提交 nX4R
cn.setAutoCommit(false); S$J}>a#Ry
2、执行一系列sql语句 $*
1?"$LN
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close RapHE; <
Statement sm ; F}3<q
sm = cn.createStatement(insert into user...); !`=ms1%U
sm.executeUpdate(); e9e%8hL
sm.close(); KiW4>@tY
sm = cn.createStatement("insert into corp...); Vcn04j#Q
sm.executeUpdate(); D`p&`]k3v
sm.close(); Rs_0xh
3、提交 ah<1&UG,
cn.commit();
o&uO ]
4、如果发生异常,那么回滚 I@Zd<