java 数据库基本操作 j:HIcCp
1、java数据库操作基本流程 (L W2S;-
2、几个常用的重要技巧: 12tAx3p
可滚动、更新的记录集 Vf$$e)
批量更新 PJ<9T3Fa
事务处理 kJCeQK:W
EO/41O
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 /:C<{m.[}
1、取得数据库连接 K d{o/R
1)用DriverManager取数据库连接 jq_ i&~S
例子 !-JvVdM;(
String className,url,uid,pwd; /1xBZfrN
className = "oracle.jdbc.driver.OracleDriver"; ZT<VDcP{
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; \
# la8,+9
uid = "system"; NE|Q0g
pwd = "manager"; CsjrQ-#9yn
Class.forName(className); zNg[%{mz
Connection cn = DriverManager.getConnection(url,uid,pwd); Q5Epq
sKyC
2)用jndi(java的命名和目录服务)方式 *rYPjk6g[
例子 @=BApuer+
String jndi = "jdbc/db"; z0|-OCmL
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); mp*?GeV?M
DataSource ds = (DataSource) ctx.lookup(jndi); 64Tb,AL_
Connection cn = ds.getConnection(); UMK9[Iy$<M
多用于jsp中 m!3D5z]n9
2、执行sql语句 3XDuo|(
1)用Statement来执行sql语句 #6C<P!]V
String sql; fk\]wFj
Statement sm = cn.createStatement(); NIp]n[=.q
sm.executeQuery(sql); // 执行数据查询语句(select) @c).&7
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 9!ARr@ ;
2)用PreparedStatement来执行sql语句 vTC{
String sql; jrX`_Y
sql = "insert into user (id,name) values (?,?)"; .Y^pDR12
PreparedStatement ps = cn.prepareStatement(sql); b)r;a5"<5
ps.setInt(1,xxx); X(Z(cY(
ps.setString(2,xxx); (&X/n=UI
... uII! ?
ResultSet rs = ps.executeQuery(); // 查询 ~Q}!4LH
int c = ps.executeUpdate(); // 更新 `$3ktQ $
6NSSuK3
3、处理执行结果 Q(4~r+
查询语句,返回记录集ResultSet
{~XAg~
更新语句,返回数字,表示该更新影响的记录数 ]2A2<Q_,
ResultSet的方法 $"MGu^0;1
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ;jBS:k?
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Tt,T6zs-<
B;2#Sa.
4、释放连接 S>jOVWB
cn.close(); /[n]t
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection }'Ph^
%ox
T# gx2Y
可滚动、更新的记录集 =)a%,H
1、创建可滚动、更新的Statement }ktK*4<k
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); t3=K>Y@w
该Statement取得的ResultSet就是可滚动的 ja(ZJ[<`
2、创建PreparedStatement时指定参数 &-m}w :j=
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); F)@zo/u5L
ResultSet.absolute(9000); a %?v/Ku
批量更新 A=70UL
1、Statement <&bBE"U4
Statement sm = cn.createStatement(); Dn#UcMO>W
sm.addBatch(sql1); QSwT1P'U
sm.addBatch(sql2); SL
+\{V2
... uO1^nK
sm.executeBatch() +]0hSpZ"p
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 O3pd5&^g
2、PreparedStatement _xnJfW_
PreparedStatement ps = cn.preparedStatement(sql); d@zxgn7o
{ 5JhpBx/>o=
ps.setXXX(1,xxx); $4og{
... ft0tRv(s:
ps.addBatch(); ~RZN+N
} /+WC6&
ps.executeBatch(); v?n# C
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 2X(2O':Uc
@X=sfygk
事务的处理 ZZc^~
1、关闭Connection的自动提交 f lt'~fe
cn.setAutoCommit(false); }iLi5Qkx
2、执行一系列sql语句 =\\rk,F
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close p0}Yo8? OW
Statement sm ; Yq:/dpA_
sm = cn.createStatement(insert into user...); $_e{Zv[
sm.executeUpdate(); K7/&~;ZwT
sm.close(); #jO2Zu2`}
sm = cn.createStatement("insert into corp...); v
"[<pFj^
sm.executeUpdate(); -^8OjGat
sm.close(); Lmw)Ts>
3、提交 g;:3I\ L
cn.commit(); _^!C4?2!
4、如果发生异常,那么回滚 [$fB]7A
cn.rollback();