java 数据库基本操作 3$R1ipb
1、java数据库操作基本流程 EVSX.'&f
2、几个常用的重要技巧: tk`v:t!6U
可滚动、更新的记录集 _{KG
4+5\X
批量更新 ND;#7/$>
事务处理 m(!FHPvN
cq]6XK-W
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ~
7s!VR
1、取得数据库连接 q9_OGd|P
1)用DriverManager取数据库连接 "8MF_Gu):
例子 o.!Dq7R
String className,url,uid,pwd; M }D}K\)
className = "oracle.jdbc.driver.OracleDriver"; 2ilQXy
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; vE?G7%,
uid = "system"; aFYIM`?(
pwd = "manager"; oc`H}Wvn
Class.forName(className); F41=b4/
Connection cn = DriverManager.getConnection(url,uid,pwd); n>YKa)|W`
2)用jndi(java的命名和目录服务)方式 ,"ZMRq
例子 ?a5! H*,
String jndi = "jdbc/db"; T5h
H
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 4[eXe$
DataSource ds = (DataSource) ctx.lookup(jndi); zF<R'XP
Connection cn = ds.getConnection(); `;C V=,M
多用于jsp中 5;EvNu
2、执行sql语句 ,O(hMI85]
1)用Statement来执行sql语句 QWYJ*
String sql; lo+A%\1
Statement sm = cn.createStatement(); Rm( "=(
sm.executeQuery(sql); // 执行数据查询语句(select) }7Q% 6&IR
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 5b*C1HS@X
2)用PreparedStatement来执行sql语句 |{ip T SH
String sql; o+'6`g'8
sql = "insert into user (id,name) values (?,?)"; rILYI;'o
PreparedStatement ps = cn.prepareStatement(sql); &u
!,Hp
ps.setInt(1,xxx); y6a3tG
ps.setString(2,xxx); Zy/_
E@C}u
... ;Y, y 4{H3
ResultSet rs = ps.executeQuery(); // 查询 4WB0Pt{
int c = ps.executeUpdate(); // 更新 /N{*"s2)
9'B `]/L
3、处理执行结果 MQ2}EY*A
查询语句,返回记录集ResultSet 2>%=U~5
更新语句,返回数字,表示该更新影响的记录数 z{QqY.Gu{G
ResultSet的方法 =s6 opL)
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Bzf^ivT3L
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 C U0YIL
z$sT !QL~
4、释放连接 Le^ n +5x
cn.close(); jP.dDYc
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection =3P)q"
!N^@4*
可滚动、更新的记录集
0y\Z9+G:
1、创建可滚动、更新的Statement Vurqt_nb
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); @6.vKCSE
该Statement取得的ResultSet就是可滚动的 DEgXQ[
2、创建PreparedStatement时指定参数 $??I/6
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); o mx=
ResultSet.absolute(9000); [-w%/D%@
批量更新 X?Q4} Y
1、Statement %BODkc Zh
Statement sm = cn.createStatement(); #'}*dy/
sm.addBatch(sql1); bN.Pex
sm.addBatch(sql2); x+]"
... %C]>9."
sm.executeBatch() |w=zOC;v
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 3so%gvY.'
2、PreparedStatement M6TD"-
PreparedStatement ps = cn.preparedStatement(sql); WIGi51yC.x
{ zQ PQ
ps.setXXX(1,xxx); =_^X3z0
... K=&>t6s<
ps.addBatch(); j>kqz>3
} !VpoZ
ps.executeBatch(); Hn:Crl y#
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 j8gdlIx
dh\P4
事务的处理 hbn([+xY
1、关闭Connection的自动提交 V]^$S"Tv
cn.setAutoCommit(false); EQ_aa@M7
2、执行一系列sql语句 ssL\g`xe
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close .+qpk*V\
Statement sm ; *zLMpL_
sm = cn.createStatement(insert into user...); Bw.i}3UT6
sm.executeUpdate(); unxqkU/<Z
sm.close(); I1J-)R+
sm = cn.createStatement("insert into corp...); ^zr`;cJ+c
sm.executeUpdate(); 4M T 7 `sr
sm.close(); fQFk+C
3、提交 lquLT6]
cn.commit(); naNghGQ
4、如果发生异常,那么回滚 EM_d8o)`B
cn.rollback();