java 数据库基本操作 6!])\Ay
1、java数据库操作基本流程 GGsDR%U
2、几个常用的重要技巧: jV`xRjh
可滚动、更新的记录集 HYf&0LT<11
批量更新 0t?:
事务处理 lpLjfHr
$5T3JOFz
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 _!kL7qJ"
1、取得数据库连接 !_)*L+7f_
1)用DriverManager取数据库连接 n#,|C`2r
例子 1foy.3g-
String className,url,uid,pwd; U7(84k\j
className = "oracle.jdbc.driver.OracleDriver"; C]K|;VQ
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Hrm^@3
uid = "system"; z/(^E8F
pwd = "manager"; E9t[Mb %0
Class.forName(className); Fu:VRul=5$
Connection cn = DriverManager.getConnection(url,uid,pwd); h^eaV,x>=
2)用jndi(java的命名和目录服务)方式
lAz.I
例子 ^2}0lP|
String jndi = "jdbc/db"; H->J.5~,K
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); V9qA.NV2
DataSource ds = (DataSource) ctx.lookup(jndi); `Xvrf
Connection cn = ds.getConnection(); [f,; +Ze
多用于jsp中 v<N7o8
2、执行sql语句 8.bIP
ju%v
1)用Statement来执行sql语句 ZG>I[V'p=
String sql; E$dPu
Statement sm = cn.createStatement(); rkh+$*t@i7
sm.executeQuery(sql); // 执行数据查询语句(select) :hB/|H*=
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 5%j
!SVW
2)用PreparedStatement来执行sql语句 `)$'1,]u
String sql; h-<2N)>!
sql = "insert into user (id,name) values (?,?)"; :786Z,')
PreparedStatement ps = cn.prepareStatement(sql); {[QCuR
ps.setInt(1,xxx); |GJSAs"L@
ps.setString(2,xxx); Uc]S7F#
... XOK.E&eilj
ResultSet rs = ps.executeQuery(); // 查询 Q[J%
int c = ps.executeUpdate(); // 更新 Lgl%fO/<t
e>\[OwF-x
3、处理执行结果 uuW._$.A>
查询语句,返回记录集ResultSet ," ~ew ,
更新语句,返回数字,表示该更新影响的记录数 c.y8 x
ResultSet的方法 ]wCg'EUB
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Y S )Q#fP
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 l1XA9>n
}S|~^
4、释放连接 3(l^{YC+[7
cn.close(); daS l.:1
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 6jT+kq)
zX{K\yp
可滚动、更新的记录集 *T0{ yI
1、创建可滚动、更新的Statement 57*`y'CW
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ib8@U}Vn1
该Statement取得的ResultSet就是可滚动的 7xidBVx
2、创建PreparedStatement时指定参数 q_K8vGm4e
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); %7WGodlXW
ResultSet.absolute(9000); *^+8_%;1
批量更新 mb_*FJB-_
1、Statement $|-joY
Statement sm = cn.createStatement(); |9cJO@
sm.addBatch(sql1); }_m/3*x_
sm.addBatch(sql2); [;yEG$)K
... p\T.l<p
sm.executeBatch() rkOLTi[$
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 1,q&A
RTS
2、PreparedStatement jA9&hbQuL
PreparedStatement ps = cn.preparedStatement(sql); uBp"YX9rx
{ ea!_/Y
ps.setXXX(1,xxx); Ao>] ~r0
... i|A0G%m] $
ps.addBatch(); 9D,`9L5-=
} D/wX
ps.executeBatch(); 2Ur9*#~kGp
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 DY| s|:d
{1a%CsCM
事务的处理 co^kP##Y
1、关闭Connection的自动提交 *0M[lR0t
cn.setAutoCommit(false); jinDKJ,n;
2、执行一系列sql语句 \=3V]7\&
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close #_)<~
Statement sm ; QEo
i9@3
sm = cn.createStatement(insert into user...); Jb+cC)(
sm.executeUpdate(); TV#X@jQ
sm.close(); uEqL Dg
sm = cn.createStatement("insert into corp...); NVqJN$z
sm.executeUpdate(); ^5n"L29V
sm.close(); 3Q'Q %2
3、提交 Te&F2`vo
cn.commit(); 0 8*bYJu
4、如果发生异常,那么回滚 t;g=@o9YA
cn.rollback();