java 数据库基本操作 \xnWciQ#{
1、java数据库操作基本流程 9*{[buZX
2、几个常用的重要技巧: 'U\<IL#U
可滚动、更新的记录集 6 1F(<!
批量更新 \l]DQaOEe
事务处理 Dk(1}%0U/
'8{Ne!y
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 <7j87
1、取得数据库连接 S|]X'f
1)用DriverManager取数据库连接 vM*($qpAy
例子 h3z{(-~y
String className,url,uid,pwd; j]aoR
className = "oracle.jdbc.driver.OracleDriver"; lna}@]oR
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; T`;%TO*Y
uid = "system"; g!+|I
pwd = "manager"; =1 Oj*x@*4
Class.forName(className); -8j+s}Q
Connection cn = DriverManager.getConnection(url,uid,pwd); d+Ek%_
2)用jndi(java的命名和目录服务)方式 =p=rg$?
例子 xK6n0] A
String jndi = "jdbc/db"; 9Bw|(J
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Y[$!`);Ye
DataSource ds = (DataSource) ctx.lookup(jndi); "F.;Dv9V[0
Connection cn = ds.getConnection(); 83Q4On
多用于jsp中 RkBb$q9F]
2、执行sql语句 :QB<?HaS'
1)用Statement来执行sql语句 fM^qQM[lG
String sql; D-4f >
Statement sm = cn.createStatement(); o8-^cP1
sm.executeQuery(sql); // 执行数据查询语句(select) @]-jl}:]
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 7w/4QiI
2)用PreparedStatement来执行sql语句 4bw4cqY;
String sql; jkt_5+S
sql = "insert into user (id,name) values (?,?)"; w &(|e <
PreparedStatement ps = cn.prepareStatement(sql); +E.GLn2/
ps.setInt(1,xxx); b7wvaRe.
ps.setString(2,xxx); h >s!K9
... )XzI
#iQ
ResultSet rs = ps.executeQuery(); // 查询 I^8"{J.Q)[
int c = ps.executeUpdate(); // 更新 "vyNxZE
elFtBnL'
3、处理执行结果 N,;5{y1;J
查询语句,返回记录集ResultSet 6Qy@UfB
更新语句,返回数字,表示该更新影响的记录数 <F=xtyl7
ResultSet的方法 4*cU<
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Ou1JIxZ)|
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 bj"J'
d
BJJZ^(
4、释放连接 |]ZYa.+:
cn.close(); ,}))u0q+:
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection iMP]W_
J_v$YwE
可滚动、更新的记录集 ~ y;6W0x
1、创建可滚动、更新的Statement }C>{uXv
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); )8UWhl=
该Statement取得的ResultSet就是可滚动的 ,]cD
2、创建PreparedStatement时指定参数 Lg*B>=
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); iIq)~e/ Z
ResultSet.absolute(9000); 66I"=:
批量更新 pn.T~"%
1、Statement 4W)B'+ZK8
Statement sm = cn.createStatement(); AG?dGj^
sm.addBatch(sql1); E7Y`|nT
sm.addBatch(sql2); mA*AeP_$
... Tp_L%F
sm.executeBatch() \&i P`v`K
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 c(n&A~*AJ%
2、PreparedStatement -!N&OZ+R
PreparedStatement ps = cn.preparedStatement(sql); NCk r /#!
{ (Xq)p y9
ps.setXXX(1,xxx); .D:Z{|.1
... 43Qtj$F
ps.addBatch(); .72S o T
} l: <?{)N`
ps.executeBatch(); NNE<L;u
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 }`v~I4i
{jho&Ai
事务的处理 .Jrqm
1、关闭Connection的自动提交 elG<k%/2
cn.setAutoCommit(false); weE/TW\e
2、执行一系列sql语句 I>[RqG
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close K,boVFs
Statement sm ; ])
rrG/3
sm = cn.createStatement(insert into user...); -xDGH
sm.executeUpdate(); bVL9vNK
sm.close(); {FIXc^m'
sm = cn.createStatement("insert into corp...); u#V5?i
sm.executeUpdate(); _',prZ*
sm.close(); =}v}my3y"
3、提交 bD[!/'4eJ
cn.commit(); HN.3
4、如果发生异常,那么回滚 dz*7gL;7G
cn.rollback();