java 数据库基本操作 DOT=U
_
1、java数据库操作基本流程 CnQg *+
2、几个常用的重要技巧: $Br>KJ%'g
可滚动、更新的记录集 pzAoq)gg:
批量更新 !(yT7#?hP
事务处理 uwId
9IOGc}
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Wv NI=>
1、取得数据库连接 *78)2)=~
1)用DriverManager取数据库连接 .5^a;`-+
例子 fo;6huz
String className,url,uid,pwd; m6eFXP1U
className = "oracle.jdbc.driver.OracleDriver"; gs-@hR.,s0
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; !4pr{S
uid = "system"; Gb?g,>C
pwd = "manager"; uX98iJ
Class.forName(className); P!9;} &
Connection cn = DriverManager.getConnection(url,uid,pwd); $wgc vySx
2)用jndi(java的命名和目录服务)方式 E0T&GR@.
例子 ?;+ ^
String jndi = "jdbc/db"; ,FY-d$3)
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Y[h#hZ
DataSource ds = (DataSource) ctx.lookup(jndi); 99a\MH`^
Connection cn = ds.getConnection(); DQMPAj.
多用于jsp中 *3P3M}3~\
2、执行sql语句 HIsB|
1)用Statement来执行sql语句 @kz!{g]Sn
String sql; A1=_nt)5
Statement sm = cn.createStatement(); =hPG_4#
sm.executeQuery(sql); // 执行数据查询语句(select) 5^b i
7J
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); b h*^{
2)用PreparedStatement来执行sql语句 `,Xb8^M2
String sql; xl3zy~;M
sql = "insert into user (id,name) values (?,?)"; q;ZLaX\bFl
PreparedStatement ps = cn.prepareStatement(sql); d&5c_6oW
ps.setInt(1,xxx); >6IXuq
ps.setString(2,xxx); k06xz#pL
... Rnzqw,q
ResultSet rs = ps.executeQuery(); // 查询 ;m''9z)2
int c = ps.executeUpdate(); // 更新 E*OG-r
A3z/Bz4]:#
3、处理执行结果 YWSz84d
查询语句,返回记录集ResultSet .#sz|0
更新语句,返回数字,表示该更新影响的记录数 ,%[LwmET
ResultSet的方法 J"5jy$30'$
1、next(),将游标往后移动一行,如果成功返回true;否则返回false =w?M_[&K)
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ^l--zzO8l
zuk"
4、释放连接 cxY$LY!zX
cn.close(); RZW$!tyI=
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 3IGCl w(
A*a7\id!y
可滚动、更新的记录集 ix^gAot
1、创建可滚动、更新的Statement oHOW5
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Q!YF!WoBX
该Statement取得的ResultSet就是可滚动的 IF5sqv
2、创建PreparedStatement时指定参数 '/ihL^^@L
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); I/Sv"X6E
ResultSet.absolute(9000); KUF$h Er
批量更新 ~:T3|
1、Statement PEfE'lGj
Statement sm = cn.createStatement(); F%9cS
:
sm.addBatch(sql1); sfyBw
sm.addBatch(sql2); pF|8OB%
... B*y;>q "{U
sm.executeBatch() @+iC/
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 4 #aqz9k
2、PreparedStatement #fwzFS \XL
PreparedStatement ps = cn.preparedStatement(sql); m dC`W&r
{ iD.0J/
ps.setXXX(1,xxx); XO 0>t{G
... z<n"{%
ps.addBatch(); CdDH1[J
} ^eT@!N
ps.executeBatch(); JOJh,8C)6
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 XpR.rq$]
"EN98^
Sl
事务的处理 UHr{
1、关闭Connection的自动提交 {cmo^~[L$
cn.setAutoCommit(false); ok%EqO
2、执行一系列sql语句 a_Z.J3
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close tvTWZ`
Statement sm ; y*}AX%8`e~
sm = cn.createStatement(insert into user...); 9!5b2!JL
sm.executeUpdate(); qo61O\qm
sm.close(); m~##q}LZ
sm = cn.createStatement("insert into corp...); v>rqOI
sm.executeUpdate(); *4-r`k|@>/
sm.close(); YfTd
3、提交 ~^^!"-
cn.commit(); Rl y jOf{0
4、如果发生异常,那么回滚 l?})_1v,R
cn.rollback();