java 数据库基本操作 AaTtYd
1、java数据库操作基本流程 8GlH)J+kq
2、几个常用的重要技巧: ,eUMSg~P.7
可滚动、更新的记录集 }sJ%InL
批量更新 iXl1S[.l
事务处理 CQ,r*VAw
W]Ph:O^5c
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 vy|}\%*r~
1、取得数据库连接 I}:>M!w
1)用DriverManager取数据库连接 vMRKs#&8
例子 :+Dn]:\
String className,url,uid,pwd; >^InNJd
className = "oracle.jdbc.driver.OracleDriver"; u]dpA
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Z,iklB-
uid = "system"; yAi4v[
pwd = "manager"; T}!7LNE
Class.forName(className); *DNH_8m
Connection cn = DriverManager.getConnection(url,uid,pwd); ,+'f unH
2)用jndi(java的命名和目录服务)方式 ZN4&:9M
例子 _cGiuxf
#
String jndi = "jdbc/db"; _l8oB)
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); H~V=TEj
DataSource ds = (DataSource) ctx.lookup(jndi); !Aw.f!
Connection cn = ds.getConnection(); cuKgO{.GH
多用于jsp中 $^
>n@Q@&L
2、执行sql语句 V;:A&
1)用Statement来执行sql语句 b/5~VY*T
String sql; tQl=
Statement sm = cn.createStatement(); q0c)pxD%`
sm.executeQuery(sql); // 执行数据查询语句(select) i;dr(c/ft
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); X 4/r#<Da
2)用PreparedStatement来执行sql语句 {?L}qV
String sql; JK_$A;Q
sql = "insert into user (id,name) values (?,?)"; &P+cTN9)
PreparedStatement ps = cn.prepareStatement(sql); 4P:vo $Cy
ps.setInt(1,xxx); Sr+1.77}
ps.setString(2,xxx); =)I{KT:y
... O/-OW: 03
ResultSet rs = ps.executeQuery(); // 查询 @K+u+}
R
int c = ps.executeUpdate(); // 更新 >XZq=q]E!
5N|77AAxK
3、处理执行结果 ]B7t9l
查询语句,返回记录集ResultSet F
H%yyT
更新语句,返回数字,表示该更新影响的记录数 %##9.Xm6l
ResultSet的方法 1^W Aps
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Bkz
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 JGdBpj:
9a4RW}S<
4、释放连接 x)Th2es\
cn.close(); @%fkW"y:
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection <'vM+Lk
\Fe5<G'v
可滚动、更新的记录集 zO\"$8q*
1、创建可滚动、更新的Statement X0P$r6 ;
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); PCIC*!{
该Statement取得的ResultSet就是可滚动的 LnyA 5T
2、创建PreparedStatement时指定参数 m76]INq
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); #UI`G3w<
ResultSet.absolute(9000); #M>E{w9
批量更新 bQeYFY#^
1、Statement 0yZw`|Zh[
Statement sm = cn.createStatement(); 34l=U?
sm.addBatch(sql1); D@ lJ^+
sm.addBatch(sql2); z"H%Y8
... SMy&K[hJ[
sm.executeBatch() LpiLk| 2i
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 AP~!YwLW
2、PreparedStatement pKJ[e@E^
PreparedStatement ps = cn.preparedStatement(sql); #,9|Hr%
{ W UV Q_<i+
ps.setXXX(1,xxx); M<L<mP}
... i@;a%$5
ps.addBatch(); D"WkD j"M
} tvH)I px
ps.executeBatch(); \G"/Myi
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 g ` {0I[
}9kq?
事务的处理 97g-*K
1、关闭Connection的自动提交 ejQCMG7
cn.setAutoCommit(false); wb?hfe
2、执行一系列sql语句 xSUR<
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close | UaI i^
Statement sm ; Q6>vF)(
-
sm = cn.createStatement(insert into user...);
Ay`a>:p
sm.executeUpdate(); <wA_2S
Y
sm.close(); Jzj~uz
sm = cn.createStatement("insert into corp...); 2#[Y/p
sm.executeUpdate(); ~@O4>T+VW
sm.close(); . =5Jpo
3、提交 iUKj:q:
cn.commit(); YsDl2P
4、如果发生异常,那么回滚 {!S/8o"]
cn.rollback();