java 数据库基本操作 NC>rZS]
1、java数据库操作基本流程 ^IjKT
2、几个常用的重要技巧: ipQJn_:2
可滚动、更新的记录集 wlAlIvIT
批量更新 8%_XJyg
事务处理 [kt!\-
9Y&n$svB
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 z~L4BY @z
1、取得数据库连接 M+gQN}BAr
1)用DriverManager取数据库连接 ;'`T
例子 [`Ol&R4k
String className,url,uid,pwd; d8C?m*3J
className = "oracle.jdbc.driver.OracleDriver"; !?DPI)
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 4+:Q"
uid = "system"; );kO27dg
pwd = "manager"; aG%KiJ7KEN
Class.forName(className); /j0<x^m/
Connection cn = DriverManager.getConnection(url,uid,pwd); A@Z&ZBDg
2)用jndi(java的命名和目录服务)方式 .6z#o{n
例子 U-QK
String jndi = "jdbc/db"; O/e5LA
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); qx18A
DataSource ds = (DataSource) ctx.lookup(jndi); 8+k\0fmy
Connection cn = ds.getConnection(); !l?Go<^*L
多用于jsp中 Op" \i
2、执行sql语句 [D[s^<RJs
1)用Statement来执行sql语句 h1z[ElEeoP
String sql; nC$f0r"z
Statement sm = cn.createStatement(); xlp^XT6#
sm.executeQuery(sql); // 执行数据查询语句(select) ]!d #2(
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); MOP/ q4j[
2)用PreparedStatement来执行sql语句 'VS!<
String sql; W#P)v{K
sql = "insert into user (id,name) values (?,?)"; ``nuw7\C:
PreparedStatement ps = cn.prepareStatement(sql); -7fsfcGM$
ps.setInt(1,xxx); /+1+6MqRn*
ps.setString(2,xxx); p(8H[L4Y
... R(74Px,/
ResultSet rs = ps.executeQuery(); // 查询 >)=FS.?]
int c = ps.executeUpdate(); // 更新 t4GG@`
Fx0E4\-
3、处理执行结果 ZF_*h`B
查询语句,返回记录集ResultSet MRxzOs
更新语句,返回数字,表示该更新影响的记录数 sTP`xaY
ResultSet的方法 >2x[ub%$L
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Gw:8-bxS
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 WNrgqyM
skh6L!6*<
4、释放连接 b/:9^&z
cn.close(); v?,_SVgAi
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection G%Hr c
%{!*)V\
可滚动、更新的记录集 KS!mzq-
1、创建可滚动、更新的Statement !X$e;V"HX
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); |>5NH'agV
该Statement取得的ResultSet就是可滚动的 f>k]{W Y
2、创建PreparedStatement时指定参数 G#t!{Q}8
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ;vR0O
ResultSet.absolute(9000); oTS*k:
C'
批量更新 0j %s
H
1、Statement -|\V'
Statement sm = cn.createStatement(); ;+'x_'a
sm.addBatch(sql1); c~3OK_k
sm.addBatch(sql2); V2Q2(yvdJ
... |Gx-c
,{{
sm.executeBatch() OC nQSkj
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 a x4V(
2、PreparedStatement F" FGPk
PreparedStatement ps = cn.preparedStatement(sql); OBqaf
)W
{ a6wPkf7-H
ps.setXXX(1,xxx); sMlY!3{Ix
... dYrw&gn
ps.addBatch(); -"Wp L2qD
} [G>8N5@*
ps.executeBatch(); {'C PLJ{R
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ~OD}`
5tdFd"oo
事务的处理 VI:
!#
1、关闭Connection的自动提交 es 8%JTi
cn.setAutoCommit(false); &<2~7?$!
2、执行一系列sql语句 H:Y?(" k
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close @W[`^jfQ
Statement sm ; f]W$4f{
sm = cn.createStatement(insert into user...); %ZF47P%6
sm.executeUpdate(); [v( \y
sm.close(); 15U]/?jv8
sm = cn.createStatement("insert into corp...); ZX[@P?A+-
sm.executeUpdate(); /Fy2ZYs,`8
sm.close(); Tf(-Duxz
3、提交 R".~{6
cn.commit(); N9QHX
4、如果发生异常,那么回滚 \=Rw/[lR
cn.rollback();