java 数据库基本操作 H<X4R
1、java数据库操作基本流程 [UR+G8X21m
2、几个常用的重要技巧: 5}e-\:J>B
可滚动、更新的记录集 ~;wSe[
批量更新 B~u{LvTE
事务处理 ElqHZ$a?
3f
eI
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 OtY.s\m y
1、取得数据库连接 }1z=
C<
1)用DriverManager取数据库连接 <)?H98S
例子 pc:K5 -Os
String className,url,uid,pwd; Xb#x^?|
className = "oracle.jdbc.driver.OracleDriver"; :}UWy?F
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; }@!d(U*
uid = "system"; mZ ONxR6q$
pwd = "manager"; 3(E"$Se,f
Class.forName(className); ;9=9D{-4+
Connection cn = DriverManager.getConnection(url,uid,pwd); )&se/x+
2)用jndi(java的命名和目录服务)方式 c^A3|tCi
例子 iWGgt]RJ
String jndi = "jdbc/db"; 4kxy7]W
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ogip#$A}3
DataSource ds = (DataSource) ctx.lookup(jndi); o=q
N+-N
Connection cn = ds.getConnection(); j)'V_@
多用于jsp中 IC92lPM }
2、执行sql语句 _Dwn@{[(8
1)用Statement来执行sql语句 _+z@Qn?#6h
String sql; $J=9$.4"
Statement sm = cn.createStatement(); =
fuF]yL%
sm.executeQuery(sql); // 执行数据查询语句(select) <*2.B~
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ehOF@IA_
2)用PreparedStatement来执行sql语句 D3;^!ln]D
String sql; _o' jy^
sql = "insert into user (id,name) values (?,?)"; ]bhzB
PreparedStatement ps = cn.prepareStatement(sql); 5(2g*I
ps.setInt(1,xxx); *)L%pH>`
ps.setString(2,xxx); D@>P%k$$s>
... j%]i#iqF
ResultSet rs = ps.executeQuery(); // 查询 s:jr/ j!
int c = ps.executeUpdate(); // 更新 fnL!@WF
|X~T</{8i
3、处理执行结果 }Jjq] lW
查询语句,返回记录集ResultSet g3e\'B'
更新语句,返回数字,表示该更新影响的记录数 F!c%&Z
ResultSet的方法 ',*I=JW;
1、next(),将游标往后移动一行,如果成功返回true;否则返回false azF"tke
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 1p+2*c
Vy-H3BR
4、释放连接 s@^GjA[6+
cn.close(); J@(*(oQb
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection PKwHq<vAsB
PX\}lTJ
可滚动、更新的记录集 k,X` }AJ6
1、创建可滚动、更新的Statement 3L=vsvO4
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); :pDw gd
该Statement取得的ResultSet就是可滚动的 <IK8Ucp
2、创建PreparedStatement时指定参数 DK*2d_
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); [<`xAh_,
ResultSet.absolute(9000); v;?t=}NwF
批量更新 YpL{c* M
1、Statement m-*du(
Statement sm = cn.createStatement(); 6LNm>O
sm.addBatch(sql1); QIBv}hgcy
sm.addBatch(sql2); _S2QY7/
... "MZVwl "E#
sm.executeBatch() ToDNBt.u{+
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 /LPSI^l!m
2、PreparedStatement sBZKf8 @/
PreparedStatement ps = cn.preparedStatement(sql); :*A6Ba
{ ~Jmn?9 3
ps.setXXX(1,xxx);
UZmzk
... UKMrR9[x*
ps.addBatch(); &R\
.^3
} ]Ol@^$8}
ps.executeBatch(); c}g^wLa
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 q,0o:nI
^[\F uSL
事务的处理 -;Cl0O%
1、关闭Connection的自动提交 e|"`W`"-
cn.setAutoCommit(false); Y]B2-wt-
2、执行一系列sql语句 amlE5GK;
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close WASs'Gx
Statement sm ; M6pGf_qt
sm = cn.createStatement(insert into user...); {hZ_f3o
sm.executeUpdate(); M2my>
sm.close(); FyZw='D
sm = cn.createStatement("insert into corp...); s-o0N{b?#'
sm.executeUpdate(); }"Hf/{E$_"
sm.close(); pYceMZ$
3、提交 bYgrKz@uK
cn.commit(); E"pq ZP =
4、如果发生异常,那么回滚 \qNj?;B
cn.rollback();