java 数据库基本操作 .<`Rq'
1、java数据库操作基本流程 8^N"D7{mO
2、几个常用的重要技巧: J5Tl62}
可滚动、更新的记录集 =r:-CRq(
批量更新 .ZrQ{~t
事务处理 ^dR5fAS
&H{KXX"X
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Q4MTedj1H
1、取得数据库连接 uNYHEs6%T$
1)用DriverManager取数据库连接 )xQA+$H#4
例子 [
Q6v #I
String className,url,uid,pwd; (HkMubnqg
className = "oracle.jdbc.driver.OracleDriver"; [Hww3+~+
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 7Jm9,4]
uid = "system"; BI] %$rq
pwd = "manager"; K G~fDb
Class.forName(className); {
O*maE"
Connection cn = DriverManager.getConnection(url,uid,pwd); &?<o692
2)用jndi(java的命名和目录服务)方式 3RP}lb
例子 %G$Kahx V>
String jndi = "jdbc/db"; i- E~ZfJ
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); %!HmtpS
DataSource ds = (DataSource) ctx.lookup(jndi); r,x;q
Connection cn = ds.getConnection(); *qE[Y0Cd
多用于jsp中 E:&ga}h
2、执行sql语句 %o+VZEH3
1)用Statement来执行sql语句 $CVbc%
String sql; )*iSN*T8q
Statement sm = cn.createStatement(); jn#
sm.executeQuery(sql); // 执行数据查询语句(select) <5~} !N X`
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Ee##:I[z
2)用PreparedStatement来执行sql语句 X] /r'Tz
String sql; s Hu~;)
sql = "insert into user (id,name) values (?,?)"; 4PEJ}BW
PreparedStatement ps = cn.prepareStatement(sql); ~J6c1jG
ps.setInt(1,xxx); dt
4_x1
ps.setString(2,xxx); xF_ Y7rw1w
... -)aBS3
ResultSet rs = ps.executeQuery(); // 查询 :r[`bqC;\*
int c = ps.executeUpdate(); // 更新 *~|xj,md
QP?Z+P<
3、处理执行结果 .Tdl'y:..
查询语句,返回记录集ResultSet y@G5I>v
更新语句,返回数字,表示该更新影响的记录数 ,bCPO`45
ResultSet的方法 (yAQm pp
1、next(),将游标往后移动一行,如果成功返回true;否则返回false U&/Jh^Yy
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 9\i,3:Qc
Tc`LY/%Od
4、释放连接 w8(qiU
cn.close(); _~DFZt@T
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection y?M99Vo4?
928szUo:
可滚动、更新的记录集 M#d_kDMw
1、创建可滚动、更新的Statement R/iw#.Yy
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); `W8GfbL
该Statement取得的ResultSet就是可滚动的 =1%3".
"n@
2、创建PreparedStatement时指定参数 l\*}
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 1HBch]J
ResultSet.absolute(9000); '@Y@H,
批量更新 XWbe|K!e
1、Statement /cr.}D2O
Statement sm = cn.createStatement(); g R(*lXm5w
sm.addBatch(sql1); M,PZ|=V6a
sm.addBatch(sql2); -[x^z5Ee`
... >'8.>f
sm.executeBatch() 1DGVAIcD
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ~/hP6*
2、PreparedStatement -X
Bh\w
PreparedStatement ps = cn.preparedStatement(sql); 7k:}9M~
{ ?PSm)
~Oa
ps.setXXX(1,xxx); rBkf @
... Q4Q*5>
ps.addBatch(); 'j!7
O+7y
} 6pQ#Zg()vp
ps.executeBatch(); ^[8e|,U
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ^ow[XEB%
X{ZBS^M
事务的处理 >GgX-SZ%
1、关闭Connection的自动提交 r 06}@ 7
cn.setAutoCommit(false); X1i6CEa<
2、执行一系列sql语句 :*6tbUp
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close l<{]%=Qg
Statement sm ; ^C@uP9g
sm = cn.createStatement(insert into user...); Om{[ <tL
sm.executeUpdate(); !/['wv@
sm.close(); M\8FjJ>9
sm = cn.createStatement("insert into corp...); 3`k1
sm.executeUpdate(); 5 8p_b
sm.close(); _pKW($\
3、提交 -";'l@D=
cn.commit(); yIbz\3
4、如果发生异常,那么回滚 M0 x5s@
cn.rollback();