java 数据库基本操作 z/YMl3$l~
1、java数据库操作基本流程 ys/mv'#>
2、几个常用的重要技巧: 2\w=U,;(
可滚动、更新的记录集 gFT~\3jp=
批量更新 (oXN >^-D
事务处理 :6u3Mj{
s3-ktZ@
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 be:phS4vz
1、取得数据库连接 'Y[A'.*}4
1)用DriverManager取数据库连接 , Ln
例子 b.4Xn0-M
String className,url,uid,pwd; ,GX~s5S8
className = "oracle.jdbc.driver.OracleDriver"; Fd[h9 G
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; B~>cNj<
uid = "system"; r%l%yCH
pwd = "manager"; h_~|O[5|)
Class.forName(className); 8A:^K:Q
Connection cn = DriverManager.getConnection(url,uid,pwd); z"K(
bw6
2)用jndi(java的命名和目录服务)方式 z@~&Kwf\}
例子 V->%)d3i
String jndi = "jdbc/db"; jRG\C=&(x
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); (a}
DataSource ds = (DataSource) ctx.lookup(jndi); #\;>8
Connection cn = ds.getConnection(); qijcS2E6S
多用于jsp中 C6d]tLE
2、执行sql语句 6B''9V:s
1)用Statement来执行sql语句 yIIETE
String sql; 4C1FPrh
Statement sm = cn.createStatement(); cVay=5].
sm.executeQuery(sql); // 执行数据查询语句(select) h4anr7g{
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); v'@b. R,
2)用PreparedStatement来执行sql语句 ~*!u
String sql; _Dj<Eu_
sql = "insert into user (id,name) values (?,?)"; i~)NQmH<
PreparedStatement ps = cn.prepareStatement(sql); 5!AV!A_Jp
ps.setInt(1,xxx); !\0F.*
ps.setString(2,xxx); BMNr<P2li
... A=%k/
ResultSet rs = ps.executeQuery(); // 查询 i<m$#6<Z
int c = ps.executeUpdate(); // 更新 <jUrE[x
nG"n-$A?<
3、处理执行结果 @8nLQh^
查询语句,返回记录集ResultSet f]8!DXEA
更新语句,返回数字,表示该更新影响的记录数 W7L+8LU;
ResultSet的方法 fpvvV(
1、next(),将游标往后移动一行,如果成功返回true;否则返回false e40udLH~x
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 #, Q}NO#vT
q_T]9d
4、释放连接 mz\NFC<
cn.close(); VLsh=v
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 3;a
R\:p@w
c^=R8y-N
可滚动、更新的记录集 rH_Jh}Y
1、创建可滚动、更新的Statement MZ|\S/
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 5"JU?e59M
该Statement取得的ResultSet就是可滚动的 53
@oP
2、创建PreparedStatement时指定参数 |2)Sd[q
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); <%z@
ResultSet.absolute(9000); G#H9g PY
批量更新 n%/i:Whs
1、Statement Xb}!0k/{
Statement sm = cn.createStatement(); yl-fbYH
sm.addBatch(sql1); upypxC
sm.addBatch(sql2); P:sAqvH6
... Y4#y34We
sm.executeBatch() D_d|=i
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 QDS0ejhp
2、PreparedStatement ;XG]Q<S\
PreparedStatement ps = cn.preparedStatement(sql); iTh
xVD
{ }Y Q:6I
ps.setXXX(1,xxx); <uZPqi||
... &hayR_F9
ps.addBatch(); ,"Tjpdf
} Is13:
ps.executeBatch(); ]pnYvXf>!
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Qyz>ZPu}sz
J58#$NC
`'
事务的处理 q7,^E`5EgU
1、关闭Connection的自动提交 Z_FNIM0f
cn.setAutoCommit(false); td >,TW=A*
2、执行一系列sql语句 3DW3LYo{
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close xf/m!b"p
Statement sm ; CtM'L
sm = cn.createStatement(insert into user...); QY@u}&m%o
sm.executeUpdate(); lEHwZ<je
sm.close(); I"1CgKYK^+
sm = cn.createStatement("insert into corp...); -Q$b7*"z(
sm.executeUpdate(); p1D()-
sm.close(); (/K5! qh
3、提交 1}!L][(
cn.commit(); H`-=?t
4、如果发生异常,那么回滚 WL l_'2h
cn.rollback();