java 数据库基本操作 7{."Y@
1、java数据库操作基本流程 W*`2lf
2、几个常用的重要技巧: Z&JW}''n|F
可滚动、更新的记录集 hh
<=D.u
批量更新 Yt0
l'B%[u
事务处理 A}H)ojG'v
*2=:(OK
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 vRRi"bo
1、取得数据库连接 8'Z9Z*^h#x
1)用DriverManager取数据库连接 x8b w#
例子 /bfsC&
3
String className,url,uid,pwd; KB*[b
className = "oracle.jdbc.driver.OracleDriver"; #E{OOcM
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ldI;DoE#U1
uid = "system"; @~QW~{y
pwd = "manager"; uH65DI<
Class.forName(className); gPQ2i])"Q
Connection cn = DriverManager.getConnection(url,uid,pwd); rguC#Xt!4
2)用jndi(java的命名和目录服务)方式 #x':qBv#
例子 oKA8)~Xqou
String jndi = "jdbc/db"; WH/r$.&
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ]/bf#&@g`k
DataSource ds = (DataSource) ctx.lookup(jndi); 5c3)p^]g
Connection cn = ds.getConnection(); C1r]kF
多用于jsp中 v(h
2、执行sql语句 *oZBv4Vh
1)用Statement来执行sql语句 _d %H;<_
String sql; lwQI
9U[O2
Statement sm = cn.createStatement(); 5a5I+*
c
sm.executeQuery(sql); // 执行数据查询语句(select) 2+sNt6B2
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); &0Wv+2l@
2)用PreparedStatement来执行sql语句 &"K74
String sql; H5^'J`0\
sql = "insert into user (id,name) values (?,?)"; J3S@1"
PreparedStatement ps = cn.prepareStatement(sql); 2@uo2]o)
ps.setInt(1,xxx); |1T2<ZT
ps.setString(2,xxx); #^yw!~:{
... BT`D|<
ResultSet rs = ps.executeQuery(); // 查询 i7mT<w>?
int c = ps.executeUpdate(); // 更新 `<b 3e(A
q`"gT;3S
3、处理执行结果 qD7#q]
查询语句,返回记录集ResultSet `[VoW2CLH+
更新语句,返回数字,表示该更新影响的记录数 3xp%o5K
ResultSet的方法 h1FM)n[E7
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ~O
65=8
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 6$9n_AS
oizD:|
4、释放连接 )/Ee#)z*
cn.close(); ?9OiF-:n
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection e@NS=U` <
6b6}HO
可滚动、更新的记录集 Q$iv27
1、创建可滚动、更新的Statement )O#>ONm^
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); [0Z
r z+q
该Statement取得的ResultSet就是可滚动的 g=o)=sQd
2、创建PreparedStatement时指定参数 J+Q
;'J
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 2/E3~X7
ResultSet.absolute(9000); 5?kF'yksR
批量更新 @Zjy"u
1、Statement UccnQZ7/I
Statement sm = cn.createStatement(); daGGgSbh
sm.addBatch(sql1); C8-4 m68"
sm.addBatch(sql2); kNd[M =%
... \m*?5]m;
sm.executeBatch() P7 H-Dw
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 mI@E>VCV[
2、PreparedStatement st+X~;PX*
PreparedStatement ps = cn.preparedStatement(sql); )$#ov-]
{ ;jo,&C
ps.setXXX(1,xxx); `:}GE@]
... vd9l1"S
ps.addBatch(); bo0m/hVU
} j42U|CuK
ps.executeBatch(); ) e;)9~
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 z,X
^;
^ :6v-
Yx
事务的处理 V[HHP_
1、关闭Connection的自动提交 {y`afuiB
cn.setAutoCommit(false); a4 O
2、执行一系列sql语句 <,`=m|z9k
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close R1&(VK{
Statement sm ; 6wqq"6w
sm = cn.createStatement(insert into user...); ++5W_Ooep
sm.executeUpdate(); )o
SFHf
sm.close(); Me`jh8(K\6
sm = cn.createStatement("insert into corp...); O<)"kj 7
sm.executeUpdate(); Q/1
6D
sm.close(); ppM d
3、提交 U~s&}M\n
cn.commit(); j_o6+Rk
4、如果发生异常,那么回滚 `Ft.Rwj2:m
cn.rollback();