java 数据库基本操作 t2uX+1F
1、java数据库操作基本流程 B+:/!_
2、几个常用的重要技巧: :c)N"EJlI2
可滚动、更新的记录集 Fuq ;4UcbL
批量更新 V(3^ev/
事务处理 Cdg/wRje
e:D8.h+&}
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 QH7"' u6
1、取得数据库连接 eg!s[1[_
1)用DriverManager取数据库连接 x ]{}y_
例子 0A9llE
String className,url,uid,pwd; K[r<-6TS
className = "oracle.jdbc.driver.OracleDriver"; ?5-Y'(r
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; K%iWUl;
uid = "system"; B|XrjI?
pwd = "manager"; wyJ+~
Class.forName(className); jrk48z
Connection cn = DriverManager.getConnection(url,uid,pwd); jkTC/9AE|
2)用jndi(java的命名和目录服务)方式 v"ZNS
例子 yK9:LXhf
String jndi = "jdbc/db"; BQTZt'p
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); |Lf>Z2E
DataSource ds = (DataSource) ctx.lookup(jndi); tqbYrF)
Connection cn = ds.getConnection(); -|V1A[
多用于jsp中 imw,Nb
2、执行sql语句 "%]<Co<S
1)用Statement来执行sql语句 ?"04u*u3
String sql; )}w2'(!X8
Statement sm = cn.createStatement(); PgHe;^?j
sm.executeQuery(sql); // 执行数据查询语句(select) 5argw+2s4$
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); tZ\e:AAi
2)用PreparedStatement来执行sql语句 2[}
O:
String sql; 5XtIVHA@{
sql = "insert into user (id,name) values (?,?)"; 89n\$7Ff9
PreparedStatement ps = cn.prepareStatement(sql); &Z'3n9zl
ps.setInt(1,xxx); ETZE.a
ps.setString(2,xxx); ISa}Km>Q
... =`<9N%
ResultSet rs = ps.executeQuery(); // 查询 BPO)<bx_
int c = ps.executeUpdate(); // 更新 :`Kv\w.
X6 E^5m
3、处理执行结果 r c++c,=
查询语句,返回记录集ResultSet Ql>bsr}
更新语句,返回数字,表示该更新影响的记录数 9B3+$uP
ResultSet的方法 tBUn
KPT
1、next(),将游标往后移动一行,如果成功返回true;否则返回false %vn"tp
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 KEfN!6
Uzh#zeZ`<
4、释放连接 Z;/QB6|%
cn.close(); Y]!WPJ`f2
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection zD^*->`p
L;RHshTy
可滚动、更新的记录集 gpT~3c;l=
1、创建可滚动、更新的Statement nIZ;N!r=i
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); -A]-o
该Statement取得的ResultSet就是可滚动的 hufpk y[&8
2、创建PreparedStatement时指定参数 ICdfak
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); pTeN[Yu?
ResultSet.absolute(9000); kB[l6`
批量更新 pYN.tD FO
1、Statement 'Nkd *
Statement sm = cn.createStatement(); -XASS%
sm.addBatch(sql1); iHa:6
sm.addBatch(sql2); )x5t']w`K
... 4yK{(!&i+
sm.executeBatch() +L0Jje>Az
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 f/PqkHF
2、PreparedStatement N=T 0Td
PreparedStatement ps = cn.preparedStatement(sql); mP*Ct6628n
{ NI
r"i2
ps.setXXX(1,xxx); (zr2b
... d H N"pNNs
ps.addBatch(); "f~*4g
} D?.H|%
ps.executeBatch(); Y~TD)c=
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 '2z1$zst,#
jhR`%aH4
事务的处理 ]A=yj@o$xN
1、关闭Connection的自动提交 8 /vGA=
cn.setAutoCommit(false); *Z8qd{.$q
2、执行一系列sql语句 Uee(1
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close s3-TBhAv
Statement sm ; t p<v
sm = cn.createStatement(insert into user...); c/lT S
sm.executeUpdate(); T{So2@_&
sm.close(); yQcIfl]f
sm = cn.createStatement("insert into corp...); #fx>{ vzH
sm.executeUpdate(); CSwPL>tUV
sm.close(); 1,7
3、提交 3ncN)E/@
cn.commit(); ;e)`Cv
4、如果发生异常,那么回滚 ;RK;kdZ
cn.rollback();