java 数据库基本操作 iNlY\67sW
1、java数据库操作基本流程 _l ,_NV&T
2、几个常用的重要技巧: VR'R7
可滚动、更新的记录集 g"KH~bN
批量更新
*v}3So
事务处理 oe4r_EkYwW
QEC4!$L^
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 S;I>W&U
1、取得数据库连接 -ff@W m
1)用DriverManager取数据库连接 ><HHO
(74X
例子 T4c]VWtD
String className,url,uid,pwd; +46m~" ]
className = "oracle.jdbc.driver.OracleDriver";
|/YwMBi
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; "p"M9P'
uid = "system"; !gyEw1Re7
pwd = "manager"; ?=},%^
Class.forName(className); ii)DOq#2
Connection cn = DriverManager.getConnection(url,uid,pwd); [(O*W
2)用jndi(java的命名和目录服务)方式 aioN)V
例子
BH<jnQ
String jndi = "jdbc/db"; ozCH1V{p
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); cns~)j~
DataSource ds = (DataSource) ctx.lookup(jndi); +YX*.dW
Connection cn = ds.getConnection(); xY=%+o.?*
多用于jsp中 LQo>wl
2、执行sql语句 > &V Y
1)用Statement来执行sql语句 I'%\
E,
String sql; <@](uWu
Statement sm = cn.createStatement(); n>o0PtGxC
sm.executeQuery(sql); // 执行数据查询语句(select) o4U[;.?c
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Z'<I
Is:J
2)用PreparedStatement来执行sql语句 R'z
-#*[
String sql; ir?Y>
sql = "insert into user (id,name) values (?,?)"; =qNZ7>Qw
PreparedStatement ps = cn.prepareStatement(sql); o9JZ-biH
ps.setInt(1,xxx); iD(+\:E
ps.setString(2,xxx); #;lB5) oe
... !RPPwvNk4
ResultSet rs = ps.executeQuery(); // 查询 h!!7LPxt
int c = ps.executeUpdate(); // 更新 ^5{0mn_4i
. 1q4Q\B<
3、处理执行结果 .Bs~FIe^
查询语句,返回记录集ResultSet o-ee3j.
更新语句,返回数字,表示该更新影响的记录数 B*-A erdH
ResultSet的方法 aSEzh78
1、next(),将游标往后移动一行,如果成功返回true;否则返回false xULcS :Q
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ^}{`bw {
]nQC
4、释放连接 -LnNA`-
cn.close(); -]-?>gkN5
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection `at>X&Ce,
,UA-Pq3}
可滚动、更新的记录集 @&F\ M}
1、创建可滚动、更新的Statement T!ik"YZ@i
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); a{y"vVQOF
该Statement取得的ResultSet就是可滚动的 gwQk
M4
2、创建PreparedStatement时指定参数 bkSI1m3
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); D:I6nSoC
ResultSet.absolute(9000); \)/dFo\l
批量更新 RLE6=#4
1、Statement Eo@b)h
Statement sm = cn.createStatement(); pN-c9n4#j
sm.addBatch(sql1); x#hGJT
sm.addBatch(sql2); j-n-2:Q
... 6<`tb)_2~
sm.executeBatch() <],~V\m
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Pf?zszvs
2、PreparedStatement WW.amv/[a
PreparedStatement ps = cn.preparedStatement(sql); >=VtL4K^
{ VYAz0H1-_
ps.setXXX(1,xxx); QZO9CLX 8k
... J.g4I|{
ps.addBatch(); ,>vI|p,/G*
} :h!&.FB
ps.executeBatch(); ;R4qE$u2^
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 bi<?m^j
JXNfE,_
事务的处理 #-^y9B
1、关闭Connection的自动提交 l6y*SW5+
cn.setAutoCommit(false); q*pWx]Y
2、执行一系列sql语句 =e!o
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close o8h1
Statement sm ; /q\{Os rX
sm = cn.createStatement(insert into user...); ]*\m@lWu
sm.executeUpdate(); p J#<e
sm.close(); ;qwNM~
sm = cn.createStatement("insert into corp...); #
ZcFxB6)
sm.executeUpdate(); AriW&E
sm.close(); >SSRwYIN
3、提交 OO /Pc
cn.commit(); kA/V=xO<
4、如果发生异常,那么回滚 \66j4?H#
cn.rollback();