java 数据库基本操作 qmUq9bV
1、java数据库操作基本流程 rXo2MX@u
2、几个常用的重要技巧: }%k,PYe/
可滚动、更新的记录集 :@g@jcbYq`
批量更新 #$V`%2>
事务处理 =QEg~sD^)s
i gzISYC_
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 M52kau
1、取得数据库连接 J{72%S
1)用DriverManager取数据库连接 YN4P
>d
例子 2 cfzLW(
String className,url,uid,pwd; N3^pFy`
className = "oracle.jdbc.driver.OracleDriver"; #|*;~:fz
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; }8WpX2U
uid = "system"; ixN>KwH
pwd = "manager"; aq3evm
Class.forName(className); :6LOb f\01
Connection cn = DriverManager.getConnection(url,uid,pwd);
Z4'"*
2)用jndi(java的命名和目录服务)方式 uE:#m.Q
例子 R= HN>(U
String jndi = "jdbc/db"; M%4o0k]E,s
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); [;dWFG"f
DataSource ds = (DataSource) ctx.lookup(jndi); #I9|>XE1
Connection cn = ds.getConnection(); DoWY*2E
多用于jsp中 dtjaQsJM^
2、执行sql语句 xD#PM |I
1)用Statement来执行sql语句 lD2>`s5
String sql; ia|^>V>-
Statement sm = cn.createStatement(); %_+9y??
sm.executeQuery(sql); // 执行数据查询语句(select) `xe[\Z2
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); :7Mo0,Bw,
2)用PreparedStatement来执行sql语句 RLY Ae
String sql; k1>%wR
sql = "insert into user (id,name) values (?,?)"; {npKdX
PreparedStatement ps = cn.prepareStatement(sql); (omdmT%D
ps.setInt(1,xxx); r5[om$|*
ps.setString(2,xxx); q p|T,D%
... ,G1|]
~
ResultSet rs = ps.executeQuery(); // 查询 z2t;!]"'l
int c = ps.executeUpdate(); // 更新 "Gcr1$xG8!
`(aU_r=
3、处理执行结果 4,f[D9|:
查询语句,返回记录集ResultSet 9.e?<u*-z
更新语句,返回数字,表示该更新影响的记录数 n]4)~ZIAU
ResultSet的方法 heZ)+}U~
1、next(),将游标往后移动一行,如果成功返回true;否则返回false P&| =
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 `u:U{m
#c4LdZu9
4、释放连接 Jf`;F :
cn.close(); M4M
4*o
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection (d993~|h
do*`-SDy
可滚动、更新的记录集 R#tz"T@
1、创建可滚动、更新的Statement F']Vg31c
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 6 6x} |7
该Statement取得的ResultSet就是可滚动的 LYh5f#
2、创建PreparedStatement时指定参数 4M(w<f\5F
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); F~a5yW:R=)
ResultSet.absolute(9000); O|,+@qtH
批量更新 Pb} &c
1、Statement `(;d+fof
Statement sm = cn.createStatement(); A4';((OXy
sm.addBatch(sql1); s5|LD'o!
sm.addBatch(sql2); 7x9YA$IE
... /Re1QS
sm.executeBatch() X_s;j5ur
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 #CV(F$\1{
2、PreparedStatement 2 )RW*Qu;+
PreparedStatement ps = cn.preparedStatement(sql); &:]_a?|*S
{ o)}b Fw
ps.setXXX(1,xxx); 4)2*|w
... oBqP^uT>a|
ps.addBatch(); ;~~Oc
} {KwLcSn
ps.executeBatch(); /7S]%UY
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 +KFK..
aSHZR
事务的处理 y#AY+
>
1、关闭Connection的自动提交 &[cL%pP
cn.setAutoCommit(false); w])~m1yW
2、执行一系列sql语句 >4M_jC.
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close N_pJE?
Statement sm ; q(.%f3(
sm = cn.createStatement(insert into user...); K1:F{*
sm.executeUpdate(); Cy6[p
sm.close(); 6El%T]^
sm = cn.createStatement("insert into corp...); =q
xcM+OX1
sm.executeUpdate(); e7#=F6
sm.close(); qx0o,oZN!
3、提交 V<4)'UI?k9
cn.commit(); fbuop&FN+q
4、如果发生异常,那么回滚 r@%32h
cn.rollback();