java 数据库基本操作 *K w/ilI
1、java数据库操作基本流程 :.\h.H;
2、几个常用的重要技巧: XpOQBXbt
可滚动、更新的记录集 HM\gOz
批量更新 %w6lNl
事务处理 e9?y0vT//
UX<0/"0h
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 T}A{Xu*:+H
1、取得数据库连接 o/\z4Ri)$
1)用DriverManager取数据库连接 Ga^k1TQq
例子 ,Onu%
String className,url,uid,pwd; {pB9T3ry]
className = "oracle.jdbc.driver.OracleDriver"; v#+tu,)V;
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 2VS#=i(B^
uid = "system"; *|:]("i
pwd = "manager"; v_@!u`
Class.forName(className); k\M">K0E
Connection cn = DriverManager.getConnection(url,uid,pwd); 4:v{\R
2)用jndi(java的命名和目录服务)方式 h'G8@j;
例子 & |o V\L
String jndi = "jdbc/db"; -3:x(^|:K
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); w+tO@
DataSource ds = (DataSource) ctx.lookup(jndi); rx;zd ?
Connection cn = ds.getConnection(); k$} 6Qd
多用于jsp中 ZsYT&P2
2、执行sql语句 x68s$H
1)用Statement来执行sql语句 ~#
|p=Y
String sql; (*Y ENT}
Statement sm = cn.createStatement(); ZpY"P6
sm.executeQuery(sql); // 执行数据查询语句(select) 6T~xjAuJ3T
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); $(%t^8{a~G
2)用PreparedStatement来执行sql语句 sQe>LNp,G
String sql; 5=Y\d,SS"
sql = "insert into user (id,name) values (?,?)"; bpeWK&
PreparedStatement ps = cn.prepareStatement(sql); ;rH@>VrR
ps.setInt(1,xxx); pF"IDC
ps.setString(2,xxx); Yt;.Z$i ,
... tI(co5 W
ResultSet rs = ps.executeQuery(); // 查询 lL:J:
int c = ps.executeUpdate(); // 更新 c^8y/wfok
7e&%R4{b
3、处理执行结果 v<Ux+-
查询语句,返回记录集ResultSet ?2b9N ~
更新语句,返回数字,表示该更新影响的记录数 [VP~~*b
ResultSet的方法 .oo>NS
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Fc<+N0M{
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 hYN b9^
ysiBru[u
4、释放连接 Gwkp(9d
cn.close(); 4%k_c79>
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Ws`P(WHm
,*Yu~4
可滚动、更新的记录集 07+Qai-]
1、创建可滚动、更新的Statement <kmn3w,vi
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); w~g)Dz2G
该Statement取得的ResultSet就是可滚动的 r
yO\$m
2、创建PreparedStatement时指定参数 6y9#am?
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); F
'U Gp
ResultSet.absolute(9000); 5<ycF_
批量更新 j7 D\O
1、Statement zW^@\kB0D
Statement sm = cn.createStatement(); AHhck?M^
sm.addBatch(sql1); 9_GR\\
sm.addBatch(sql2); cv["Ps#;`W
... aNCIh@m~
sm.executeBatch()
Ol24A^
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ,#r>#fi0
2、PreparedStatement ""ICdZ_A
PreparedStatement ps = cn.preparedStatement(sql); PZ"=t!
{ _`zj^*%
ps.setXXX(1,xxx); 6F3#Rxh
... ( Qw"^lE3
ps.addBatch(); pemb2HQ'4j
} S0Y$$r
ps.executeBatch(); u#Qd`@p
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 BS;_l"?
b#^UP
事务的处理 ~V"D|U;i +
1、关闭Connection的自动提交 .~6p/fHX
cn.setAutoCommit(false); DO$jX
4
2、执行一系列sql语句 Dw^d!%Ala
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ]|[oL6"
Statement sm ; ;Z"6ve4
sm = cn.createStatement(insert into user...); ]J C}il_b
sm.executeUpdate(); T0Q)}%L
sm.close(); ?j8F5(HF?
sm = cn.createStatement("insert into corp...); B@l/'$G
sm.executeUpdate(); 2, ` =i
sm.close(); [L,Tf_t^Y
3、提交 aQaO.K2
cn.commit(); u%S&EuX
4、如果发生异常,那么回滚 yla&/K;|*
cn.rollback();