java 数据库基本操作 21M@z(q*
1、java数据库操作基本流程 $@[6j y
2、几个常用的重要技巧: azz6_qk8
可滚动、更新的记录集 u\-xlp?"o
批量更新 $Ne$s
事务处理 8 vK
Z;
tlu-zUsi
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 >f4H<V-
1、取得数据库连接 )Ve?1?s '8
1)用DriverManager取数据库连接 py9(z`}
例子 zCj]mH`es'
String className,url,uid,pwd; nRN&u4
className = "oracle.jdbc.driver.OracleDriver"; {,|*99V
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; %O>ehIerD
uid = "system"; #0"Fw$Pc
pwd = "manager"; _kl.zw%
Class.forName(className); XKLkJZN
Connection cn = DriverManager.getConnection(url,uid,pwd); [GZ%K`wx
2)用jndi(java的命名和目录服务)方式 xl@l<
例子 wgpu]ooUF&
String jndi = "jdbc/db"; QM`A74j0]\
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Ki{&,:@
DataSource ds = (DataSource) ctx.lookup(jndi); Uaog_@2n,
Connection cn = ds.getConnection(); 2#ND(
多用于jsp中 B.6gJ2c
2、执行sql语句 2ksX6M3kY
1)用Statement来执行sql语句 mu04TPj
String sql; ]wWN~G)2lV
Statement sm = cn.createStatement(); `$SX%AZA
sm.executeQuery(sql); // 执行数据查询语句(select) )FGm5-K@
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 4]u53`
2)用PreparedStatement来执行sql语句 E KhwrBjS
String sql; w_q{C>-cR
sql = "insert into user (id,name) values (?,?)"; _n@#Lufx
PreparedStatement ps = cn.prepareStatement(sql); J7/"8S_#N
ps.setInt(1,xxx); 4a00-y='
ps.setString(2,xxx); i5w
... XLz>h(w=
ResultSet rs = ps.executeQuery(); // 查询 )t{?7wy
int c = ps.executeUpdate(); // 更新 L0Bcx|)"$`
h)7{Cj
3、处理执行结果 W'eF
| hu
查询语句,返回记录集ResultSet %fnL
更新语句,返回数字,表示该更新影响的记录数 6%~ Z^>`N
ResultSet的方法 (eS4$$g
1、next(),将游标往后移动一行,如果成功返回true;否则返回false v1<3y~'f
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 M%5qx,JQY
LJ`*&J
4、释放连接 R2yiExw<
cn.close(); (e6JI]tz{
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Eb{Zm<TP
Tn<
<i
可滚动、更新的记录集 uV`r_P
1、创建可滚动、更新的Statement m!SxX&m"G
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ='a[(C&Y
该Statement取得的ResultSet就是可滚动的 e<6fe-g9;
2、创建PreparedStatement时指定参数 <xOXuve
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); x
hBlv
ResultSet.absolute(9000); ,<0R'R
批量更新 XT>
u/Z )
1、Statement d}j%.JJK
Statement sm = cn.createStatement(); 3#`_t :"A
sm.addBatch(sql1); =<MSM\Rb
sm.addBatch(sql2); n|sP0,$N1
... EE(1;]d-
sm.executeBatch() {Y6U%HG{{r
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 WM$}1:O
2、PreparedStatement -61{ MMiA
PreparedStatement ps = cn.preparedStatement(sql); ozwPtF5
{ "MQy>mD6
ps.setXXX(1,xxx); b(+M/O>I
... oP;"`^_
ps.addBatch(); 109dB$+$
} -b"mx"'?
ps.executeBatch(); 9`VgD<?v
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Fy37I/#)r&
P~`gWGC}
事务的处理 @?lmho?
1、关闭Connection的自动提交 1`J-|eH=Q
cn.setAutoCommit(false); XFKe6:
2、执行一系列sql语句 3cfW|J
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close uMKO^D
Statement sm ; GcaLP*%>B
sm = cn.createStatement(insert into user...); I },.U&r
sm.executeUpdate(); #pO=\lJ,
sm.close(); `dekaRo
sm = cn.createStatement("insert into corp...); smaPZ^;; j
sm.executeUpdate(); Fv$5Zcf
sm.close(); L"{qF<@V7&
3、提交 4v9jGwnz t
cn.commit(); kk#%x#L[
4、如果发生异常,那么回滚 R?Zv
cn.rollback();