java 数据库基本操作 KfSI6
Y_
1、java数据库操作基本流程 JD Q7
2、几个常用的重要技巧: Wsz-#kc\[
可滚动、更新的记录集 6@"lIKeP
批量更新 N3_rqRd^
事务处理 ]dx6E6A,
yJ\K\\]
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 *?'^Rc
1、取得数据库连接 V<ZohB?y
1)用DriverManager取数据库连接 K,!"5W rX*
例子 XS L*e
String className,url,uid,pwd; 9]{(~=D7
className = "oracle.jdbc.driver.OracleDriver"; zNF.nS}:
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ;^Q- 1
uid = "system"; $50/wb6s
pwd = "manager"; Gk!06
Class.forName(className); .4jU G=
Connection cn = DriverManager.getConnection(url,uid,pwd); z
qM:'x*
2)用jndi(java的命名和目录服务)方式 Au-_6dT
例子 @Kx@ 2#~b
String jndi = "jdbc/db"; w:|BQ,
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); lWVvAoe
DataSource ds = (DataSource) ctx.lookup(jndi); X9J&OQ[W
Connection cn = ds.getConnection(); cv .R`)l
多用于jsp中 *A2D}X3s
2、执行sql语句 (1t b
1)用Statement来执行sql语句 w^_[(9
`
String sql; b5-W K;
Statement sm = cn.createStatement(); V Z#@7t
sm.executeQuery(sql); // 执行数据查询语句(select) "sM
3NY
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Ju0W
2)用PreparedStatement来执行sql语句 F8c^M</
String sql; =B+^-2G8
sql = "insert into user (id,name) values (?,?)"; F%Xj'=
PreparedStatement ps = cn.prepareStatement(sql); -<Wv7FNpD
ps.setInt(1,xxx); Y-0o>:SM
ps.setString(2,xxx); ]vFtByqn
... Sk~( t
ResultSet rs = ps.executeQuery(); // 查询 0Gq}x;8H&
int c = ps.executeUpdate(); // 更新 'b?Px}
U{8]TEv
3、处理执行结果 0u3"$o'R
查询语句,返回记录集ResultSet 0q@U>#
更新语句,返回数字,表示该更新影响的记录数 Z=L~W,0'
ResultSet的方法 c"|4'#S
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 1<Z~Gw4
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 }JF,:g
Lk
>~nc7j
u
4、释放连接 d0b`qk @4
cn.close(); L.cGt"{
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ~{8X$xs
,%bG]5
可滚动、更新的记录集 uxxS."~
1、创建可滚动、更新的Statement e\9H'$1\
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); U2lDTRt
该Statement取得的ResultSet就是可滚动的 Vb
_W&Nwd
2、创建PreparedStatement时指定参数 L. %N
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); m(B,a,g<
ResultSet.absolute(9000); */T.]^
批量更新 L\CufAN
1、Statement /^m3?q[a
Statement sm = cn.createStatement(); _o'3v=5T
sm.addBatch(sql1); [K*>W[n
sm.addBatch(sql2); `4@_Y<
... i*T>,z
sm.executeBatch() THFzC/~Q
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 QJsud{ada
2、PreparedStatement |uT&M`7\{
PreparedStatement ps = cn.preparedStatement(sql); g[#4`Q<.
{ Zx1 I&K\Cd
ps.setXXX(1,xxx); JUf{;nt
... q=_&izmE'7
ps.addBatch(); `T-lBwH
} ,h#U<CnP#
ps.executeBatch(); 2l8TX #K
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 3;N+5*-
p^E}%0#
事务的处理 Hq>"rrVhx
1、关闭Connection的自动提交 T|/B}srm
cn.setAutoCommit(false); }Q=@$YIesD
2、执行一系列sql语句 0Rme}&$
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close n#NE.ap$&,
Statement sm ; ?HsQ417.H
sm = cn.createStatement(insert into user...); ]]InD N
sm.executeUpdate(); 7AOjlC9R}
sm.close(); XDot3)2`
sm = cn.createStatement("insert into corp...); "!fvEE
sm.executeUpdate(); >h[ {_+
sm.close(); A#WvN>
3、提交 SEL7,8 Hm
cn.commit(); |?kZfr&9q
4、如果发生异常,那么回滚 miq"3
cn.rollback();