java 数据库基本操作 L &nqlH@+~
1、java数据库操作基本流程 4IUdlb
2、几个常用的重要技巧: /ZpwJc`e
可滚动、更新的记录集 ) Z^b)KAk
批量更新 FcaO-
事务处理 fZ7Ap3dmP
#UYrSM@u
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 i7#PYt
1、取得数据库连接 Q}qw`L1
1)用DriverManager取数据库连接 9=FqI50{
例子 q wd7vYBc,
String className,url,uid,pwd; r}%2;!T
className = "oracle.jdbc.driver.OracleDriver"; hP$v,"$
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; xoQ;fVNp
uid = "system"; KO''B or
pwd = "manager"; J}M_Ka
Class.forName(className); G-#]|)
Connection cn = DriverManager.getConnection(url,uid,pwd); 2]i>kV/,0
2)用jndi(java的命名和目录服务)方式 :u4q.^&!e
例子 a"Q> K7K
String jndi = "jdbc/db"; Kx<T;iJ}
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); <GRplkf`
DataSource ds = (DataSource) ctx.lookup(jndi); 8+=-!":]
Connection cn = ds.getConnection(); QH]G>+LI5
多用于jsp中 vXUq[,8yf
2、执行sql语句 K'tckJ#%
1)用Statement来执行sql语句 m_;<7W&p]
String sql; qy$1+>f1
Statement sm = cn.createStatement(); |u5Xi5q.f
sm.executeQuery(sql); // 执行数据查询语句(select) T x
6\
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); M%S.Z4D
(0
2)用PreparedStatement来执行sql语句 |Js?@
String sql; V#-\ 4`c
sql = "insert into user (id,name) values (?,?)"; >mXq= 9L4
PreparedStatement ps = cn.prepareStatement(sql); yG~7Xo5
ps.setInt(1,xxx); wrJ:jTh
ps.setString(2,xxx); <JkmJ/X
... PS\n0
ResultSet rs = ps.executeQuery(); // 查询 8Vf]K}d
int c = ps.executeUpdate(); // 更新 \]$TBN
dJ4
4w<4\zT_U}
3、处理执行结果 {EL
J!o[
查询语句,返回记录集ResultSet |tua*zEsS
更新语句,返回数字,表示该更新影响的记录数 2z+-vT%
ResultSet的方法 \7elqX`.yY
1、next(),将游标往后移动一行,如果成功返回true;否则返回false fk!P#
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 h^aUVuL/
2nsW)bd
4、释放连接 q?TI(J+/
cn.close(); K2gg"#ft?
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ~P@6fK/M
@+EO3-X5
可滚动、更新的记录集 @9ndr$t
1、创建可滚动、更新的Statement *<rBV`AP
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); n `Ry!
该Statement取得的ResultSet就是可滚动的 UX!)\5-
2、创建PreparedStatement时指定参数 zmdu\:_X9
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Hs>|-iDs(
ResultSet.absolute(9000); 9%MHIY5
批量更新 S#g=;hD
1、Statement g]a5%8*{
Statement sm = cn.createStatement(); iF!r}fUU6
sm.addBatch(sql1); x=jS=3$8
sm.addBatch(sql2); 9 U!-Zn!
... /~nPPC
sm.executeBatch() ?VaAVxd29
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 8*[Q{:'.
2、PreparedStatement l2[{T^
PreparedStatement ps = cn.preparedStatement(sql); (Ymj
{ GL-r;
ps.setXXX(1,xxx); P{tH4V23T
... 1,pg7L8H
ps.addBatch(); ^+b ??K
} tuWJj^
ps.executeBatch(); 9X%H$>s
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 SRfnT?u6
Vub($
事务的处理 qQ=\R1l
1、关闭Connection的自动提交 +\@}IKWl-?
cn.setAutoCommit(false); w]Byl3}Gt
2、执行一系列sql语句 R3\oLT4
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close :^92B?q
Statement sm ; HAOl&\)7"_
sm = cn.createStatement(insert into user...); T#:n7$M|?A
sm.executeUpdate(); 2S#|[wq(
sm.close(); $u-yw1FT
sm = cn.createStatement("insert into corp...); F `cuV
sm.executeUpdate(); G;k#06
sm.close(); b,MzHx=im
3、提交 z&@O\>Q
cn.commit(); "T0s7LWp
4、如果发生异常,那么回滚 ~o?(O1QY
cn.rollback();