java 数据库基本操作 qk%;on&`
1、java数据库操作基本流程 66g9l9wm(
2、几个常用的重要技巧: vLv@&lMW
可滚动、更新的记录集 kjTduZ/3"
批量更新 {DV_*5
事务处理 \T4v|Pw\
y_*
!6Xr
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 P{8iJ`rBG
1、取得数据库连接 Y>dF5&(kb
1)用DriverManager取数据库连接 &C`Gg<
例子 iN bIp"W
String className,url,uid,pwd; &fDIQISC
className = "oracle.jdbc.driver.OracleDriver"; Tr_w]'
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; !{ y@od@T
uid = "system"; R[zpD%CI
pwd = "manager"; $.Qkb@}
Class.forName(className); ]&o$b ]
Connection cn = DriverManager.getConnection(url,uid,pwd); ;;!yC
2)用jndi(java的命名和目录服务)方式 NxkGOAOE
例子 ..IfP@
String jndi = "jdbc/db"; VpE*(i$
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ~8PZ5;g
DataSource ds = (DataSource) ctx.lookup(jndi); u}#(.)a:
Connection cn = ds.getConnection(); 1vS#K=sb
多用于jsp中 Ow+GS{-q
2、执行sql语句 LD+{o 4i
1)用Statement来执行sql语句 1auIR/=-
String sql; iW)8j 8
Statement sm = cn.createStatement(); n4O]8C'lW9
sm.executeQuery(sql); // 执行数据查询语句(select) y%&q/tk
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); S8kCp;
2)用PreparedStatement来执行sql语句 bHY=x}Hv
String sql; }fp-pe69z
sql = "insert into user (id,name) values (?,?)"; (o 5s"b
PreparedStatement ps = cn.prepareStatement(sql); Q7HRzA^-
ps.setInt(1,xxx); Sgeh %f
ps.setString(2,xxx); i[O& )N,c
... `fA@hK
ResultSet rs = ps.executeQuery(); // 查询 ^7w+l @
int c = ps.executeUpdate(); // 更新 `{f}3bO7C
zG }@0
3、处理执行结果 ?qmRbDI
查询语句,返回记录集ResultSet "H=6j)Cb
更新语句,返回数字,表示该更新影响的记录数 wy<\Tg^J
ResultSet的方法 S.mG?zbw
1、next(),将游标往后移动一行,如果成功返回true;否则返回false LGq'WU31:)
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 A`N,
&u]8IEv}u
4、释放连接 } +TORR?
cn.close(); a[>/h3
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Q0)#8Rcm
oTEL?hw5
可滚动、更新的记录集 uF X#`^r`
1、创建可滚动、更新的Statement yks__ylrl(
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); q}b
dxa
该Statement取得的ResultSet就是可滚动的
"0V.V>-p
2、创建PreparedStatement时指定参数 ?1*cO:O
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); [meO[otb
ResultSet.absolute(9000); ;o
6lf_
批量更新 #oS<E1
1、Statement ;(b9#b.
Statement sm = cn.createStatement(); U#0Q)
sm.addBatch(sql1); 46}g7skD
sm.addBatch(sql2); .ODU
... y;4OY
sm.executeBatch() 4(#'_jS
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 1NbG>E#Ol
2、PreparedStatement MS
nG3]{z
PreparedStatement ps = cn.preparedStatement(sql); %2}-2}[>
{ ADz ^\
ps.setXXX(1,xxx); fZ6MSAh
... |5X^u+_
ps.addBatch(); VRVO-Sk
} M f}~{+
ps.executeBatch(); c_dVWh e
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 zKyyU}LHH
b10cuy|a/X
事务的处理 tl[Uw[
1、关闭Connection的自动提交 'S20\hwt-
cn.setAutoCommit(false); <kfnpB=
2、执行一系列sql语句 ({ +!`}GY
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close /?wtF4
Statement sm ; nyX2|m&
sm = cn.createStatement(insert into user...); FXpJqlhNv
sm.executeUpdate(); TCMCK_SQL
sm.close();
+Te\H
sm = cn.createStatement("insert into corp...); TeMHm?1^
sm.executeUpdate(); b}2ED9HG\
sm.close(); HNb/-e ,"
3、提交 S%$ }(
cn.commit(); ^8]NxV@l
4、如果发生异常,那么回滚 )~&CvJ
cn.rollback();