java 数据库基本操作 )~rN{W<s`H
1、java数据库操作基本流程 l,L#y4#
2、几个常用的重要技巧: 2}t2k>
可滚动、更新的记录集 TN(1oJ:
批量更新 W,}C*8{+
事务处理 m\[r6t]V
|6$6Za]:
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 mI@]{K}Q%
1、取得数据库连接 L=
hPu#&/
1)用DriverManager取数据库连接 @MTm8E6au
例子 <!R~G-D#_T
String className,url,uid,pwd; 0zetOlFbO
className = "oracle.jdbc.driver.OracleDriver"; nCJ)=P.d
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; GoZr[=d
uid = "system"; NEJxd%-
pwd = "manager"; Yaht<Hy
Class.forName(className); L3,p8-d9Z
Connection cn = DriverManager.getConnection(url,uid,pwd); ;i> |5tEy
2)用jndi(java的命名和目录服务)方式 G-xW&wC-
例子 u05Zg*.[
String jndi = "jdbc/db"; ?(4=:o
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Js ~_8
DataSource ds = (DataSource) ctx.lookup(jndi); qf7lQovK
Connection cn = ds.getConnection(); wm!Y5
多用于jsp中 BH0].-)[y!
2、执行sql语句 >`SIB; &>j
1)用Statement来执行sql语句 "I}3*s9Q-
String sql; 44b;]htv
Statement sm = cn.createStatement(); Z-.`JkKd8
sm.executeQuery(sql); // 执行数据查询语句(select) m onqaSF
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); .e~17}Ka}
2)用PreparedStatement来执行sql语句 ^,qi`Tk
String sql; 7NE"+EP\{2
sql = "insert into user (id,name) values (?,?)"; 4DaLmQ2O
PreparedStatement ps = cn.prepareStatement(sql); UW_fn
ps.setInt(1,xxx); V)=!pT
ps.setString(2,xxx); >S,yqKp37~
... +"'cSAK
ResultSet rs = ps.executeQuery(); // 查询 |1uyJ?%B
int c = ps.executeUpdate(); // 更新 p<: bPw
QJ\
o"c
3、处理执行结果 mbK$_HvU
查询语句,返回记录集ResultSet ?I6 !m~
更新语句,返回数字,表示该更新影响的记录数 \ym3YwP4/:
ResultSet的方法 4f:B 2x{
1、next(),将游标往后移动一行,如果成功返回true;否则返回false jTH,GF
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 v=R=K
_ ?]bd-E
4、释放连接 pqmtN*zV
cn.close(); 3dTz$s/[
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection fucG 9B
h(l4\)
可滚动、更新的记录集
hRHqG
1、创建可滚动、更新的Statement ;shhgz$
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); UJ* D
该Statement取得的ResultSet就是可滚动的 %\IB_M
2、创建PreparedStatement时指定参数 4}E|CD/pZ
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); %F_)!M;x
ResultSet.absolute(9000); F<39eDNpz
批量更新 -|YG**i/
1、Statement D,b'1=
Statement sm = cn.createStatement(); 3copJS
sm.addBatch(sql1); XEl-5-M"
sm.addBatch(sql2); ;89 `!V O
...
T)?:q
sm.executeBatch() :[YHJaK
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 LX2rg\a+%
2、PreparedStatement P|%uB'|H
PreparedStatement ps = cn.preparedStatement(sql); =bgzl=A`
{ _FR_6*C)5
ps.setXXX(1,xxx); K[r<-6TS
... %38HGjS
ps.addBatch(); 1fUg
} ova4
ps.executeBatch(); cNOtfn6?F
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 yq]= +X>(
WR,MqM20
事务的处理 KcKdhqdN-
1、关闭Connection的自动提交 /enlkZx=8
cn.setAutoCommit(false); UEHJ?
}
2、执行一系列sql语句 &y_Ya%Z3*e
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close = Lt)15
Statement sm ; RC?gozBFJ
sm = cn.createStatement(insert into user...); [}:;B$,
sm.executeUpdate(); pZHx
sm.close(); >J(._K
sm = cn.createStatement("insert into corp...); F#Y9 @E
sm.executeUpdate(); m#w1?y)Z@X
sm.close(); y``[CBj
3、提交 f3PDLQA
cn.commit(); Bl[4[N
4、如果发生异常,那么回滚 ;GQCq@)-
cn.rollback();