java 数据库基本操作 ^iA9%zp
1、java数据库操作基本流程 mpyt5#f
2、几个常用的重要技巧: :FF=a3/"6
可滚动、更新的记录集 jXJyc'm7
批量更新 +`4A$#$+y
事务处理 *CMx- _
;uW FHc5@B
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 qq?!LEZ
1、取得数据库连接 hH.G#-JO
1)用DriverManager取数据库连接 +T ?NH9
例子 _1^'(5f$
String className,url,uid,pwd; /Oono6j
className = "oracle.jdbc.driver.OracleDriver"; H,J8M{
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; !D6]JPX
uid = "system"; =4!mAo}
pwd = "manager"; 9WHddDA
Class.forName(className); buC{r,
Connection cn = DriverManager.getConnection(url,uid,pwd); <@}9Bid!o
2)用jndi(java的命名和目录服务)方式 !>tL6+yj
例子 ,4rPg]r@
String jndi = "jdbc/db"; =N@t'fOr
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ?2a $*(
DataSource ds = (DataSource) ctx.lookup(jndi); 1YA% -~
Connection cn = ds.getConnection(); Xj*Wu_
多用于jsp中 :Tc^y%b0
2、执行sql语句 YIE<pX4Q7)
1)用Statement来执行sql语句 6*?F @D2&
String sql; 0(Ij%Wi,
Statement sm = cn.createStatement(); ?%86/N>
sm.executeQuery(sql); // 执行数据查询语句(select) )0MB9RMk1
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); B!yr!DWv
2)用PreparedStatement来执行sql语句 kza5ab
String sql; |{;G2G1[
sql = "insert into user (id,name) values (?,?)"; ^aQ"E9
PreparedStatement ps = cn.prepareStatement(sql); ivPg9J1S
ps.setInt(1,xxx); $(
)>g>%
ps.setString(2,xxx); Bx!-"e
... -di o5a
ResultSet rs = ps.executeQuery(); // 查询 !wNO8;(
int c = ps.executeUpdate(); // 更新 ]9L
oZ)
BVm0{*-[|
3、处理执行结果 {*KEP
查询语句,返回记录集ResultSet BY*Q_Et
更新语句,返回数字,表示该更新影响的记录数 U.TA^S]`g
ResultSet的方法 .543N<w
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ,[Fb[#Qqb
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 V]N?6\Op
JRFtsio*
4、释放连接 ]k(]qZ
cn.close(); [Q =Nn
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection HDKbF/
F?cK-.
可滚动、更新的记录集 7rA;3?p)
1、创建可滚动、更新的Statement n(Uyz`qE
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); }%z
该Statement取得的ResultSet就是可滚动的 S$3JMFA
2、创建PreparedStatement时指定参数 $cR{o#
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); C?Ucu]cW
ResultSet.absolute(9000); 7KPwQ?SjT
批量更新 G`zm@QL
1、Statement kLY^!
Statement sm = cn.createStatement(); -+5>|N#
sm.addBatch(sql1); FqifriLN
sm.addBatch(sql2); @6d[=!9
... V:27)]q
sm.executeBatch() w*!aZ,P
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 b2]Kx&!
2、PreparedStatement f-d1KNY
PreparedStatement ps = cn.preparedStatement(sql); B:QHwzd
{ i&k7-<
ps.setXXX(1,xxx); W l16`9
...
9akH
ps.addBatch(); <X5fUU"+U
} _wOt39e&
ps.executeBatch(); ~v83pu1!2s
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 +O5hH8<&b
Q &t<Y^B
事务的处理 gJhiGYx
1、关闭Connection的自动提交 V$~9]*Wn
cn.setAutoCommit(false); LF7SS;&~f
2、执行一系列sql语句 f-2c0Bi
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close b6 M
Statement sm ; iI>A *,{,`
sm = cn.createStatement(insert into user...); `"~%bS
sm.executeUpdate(); KYP!Rs/j.
sm.close(); }&e5$lB
sm = cn.createStatement("insert into corp...); BZxvJQ
sm.executeUpdate(); i?~3*#IpD
sm.close(); wPl%20t
3、提交 X7wKy(g
cn.commit(); 4X$Qu6#i
4、如果发生异常,那么回滚 tl].r|yl
cn.rollback();