java 数据库基本操作 byUstm6y
1、java数据库操作基本流程 )mw&e}jRV
2、几个常用的重要技巧: c*#*8R9.y
可滚动、更新的记录集 x#_0
6
批量更新 [Vaw$c-+[y
事务处理
6:vdo~
q!P{a^Fnc
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 R87e"m/C%
1、取得数据库连接 z(&~O;;N#
1)用DriverManager取数据库连接 I,xV&j+<
例子 E|fQbkfw
String className,url,uid,pwd; J<'I.KZ\z
className = "oracle.jdbc.driver.OracleDriver"; I2PFJXp_]n
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; S*-/#j
uid = "system";
hO@VYO
pwd = "manager"; 7D%}(pX
Class.forName(className); A(Ss:7({
Connection cn = DriverManager.getConnection(url,uid,pwd); _7LZ\V+MLW
2)用jndi(java的命名和目录服务)方式 1Xi.OGl
例子 zn@yt%PCV
String jndi = "jdbc/db"; +(|6Wv
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); JxM[LvVi
DataSource ds = (DataSource) ctx.lookup(jndi); cc^ [u+
Connection cn = ds.getConnection(); y=)xo7(
多用于jsp中 NJ{M-K%>
2、执行sql语句 b];p/V#
<
1)用Statement来执行sql语句 $M=W`E[g
String sql; {)8!> K%G
Statement sm = cn.createStatement(); ]FLi^}ct
sm.executeQuery(sql); // 执行数据查询语句(select) (NBq!;_2,x
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ?yq1\G)]
2)用PreparedStatement来执行sql语句 .s!qf!{V`
String sql; eBW=bK~[VP
sql = "insert into user (id,name) values (?,?)"; !w9w{dtW=
PreparedStatement ps = cn.prepareStatement(sql); ?A4t
&4
ps.setInt(1,xxx); `Mxi2Y{vp
ps.setString(2,xxx); 3M[b)At V.
... BcvCm+.S:
ResultSet rs = ps.executeQuery(); // 查询 <x|P}
int c = ps.executeUpdate(); // 更新 _#8OHG.x
ZCbnDj
3、处理执行结果 Y@Zv52,
查询语句,返回记录集ResultSet cKKl\g@}
更新语句,返回数字,表示该更新影响的记录数 lp;=f
ResultSet的方法 D!oELZ3
1、next(),将游标往后移动一行,如果成功返回true;否则返回false +w ]KK6
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 9
Z D4Gv
Lh(`9(tX
4、释放连接 C<.Ny,U
cn.close(); >[ox|_o
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ?Hd/!I&
mw*BaDN@Q
可滚动、更新的记录集 viJK%^U=-
1、创建可滚动、更新的Statement wA#w]8SM
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 1[;~>t@C
该Statement取得的ResultSet就是可滚动的 -3fzDxD
2、创建PreparedStatement时指定参数 ]8qFxJ+2^
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); eBmBD"$
ResultSet.absolute(9000); j}CZ*
批量更新 yLI)bn!"
1、Statement I,@f*o
Statement sm = cn.createStatement(); : 6*FnKD
sm.addBatch(sql1); tJQFhY
sm.addBatch(sql2); M;{btu^a
... c9eLNVM
sm.executeBatch() kq
SpZoV0'
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Nn_n@K
2、PreparedStatement 4{s3S2f=
PreparedStatement ps = cn.preparedStatement(sql); D# "ppa}
{ Z7X_U`Q
ps.setXXX(1,xxx); wewYlm5@
... VNmQ'EuV}2
ps.addBatch(); 5IPZ;
} fgW>U*.ar
ps.executeBatch(); vThK@P!s
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 O7_u9lz2
R4V~+tnbG&
事务的处理 v?U;o&L(
1、关闭Connection的自动提交 g (i_di
cn.setAutoCommit(false); ugwZAC
2、执行一系列sql语句 XRMYR97
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close FKOTv2
Statement sm ; 12yr_
sm = cn.createStatement(insert into user...); J\BTrN 7
sm.executeUpdate(); ;e>pu"#
sm.close(); o-))R| ~z
sm = cn.createStatement("insert into corp...); 8pQx6QE
sm.executeUpdate(); OUd&fUmH
sm.close(); QD6in>+B@
3、提交 (Mk9##R#
cn.commit(); ky`xBO=
4、如果发生异常,那么回滚 DaV:Slp9
cn.rollback();