java 数据库基本操作 FMT_X
1、java数据库操作基本流程 :b,An'H
2、几个常用的重要技巧: m1RjD$fM
可滚动、更新的记录集 =Nr?F'<
批量更新 Q3[nS(#Z/=
事务处理 r%`3*<ALV)
p & i+i
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 !^Q4ZL,-
1、取得数据库连接 ;Ao`yC2(v
1)用DriverManager取数据库连接 sRC?l_n;
例子 S) `@)sr
String className,url,uid,pwd; qCm8R@
className = "oracle.jdbc.driver.OracleDriver"; VwT&A9&{8
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; .RWq!Z=)3
uid = "system"; _D8:p>=
pwd = "manager"; _TbvQY
Class.forName(className); RG_6&
A
Connection cn = DriverManager.getConnection(url,uid,pwd); }5}#QHF
2)用jndi(java的命名和目录服务)方式 }-p-(
例子 #r@>.S=U]
String jndi = "jdbc/db"; /{-J_+u*%
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); A$l
DataSource ds = (DataSource) ctx.lookup(jndi); }&^1")2t
Connection cn = ds.getConnection(); fjm3X$tR
多用于jsp中 Y0ACJ?|
2、执行sql语句 l7(p~+o?h>
1)用Statement来执行sql语句 QiNLE'19^
String sql; 27Vx<W
Statement sm = cn.createStatement(); CW,|l0i
sm.executeQuery(sql); // 执行数据查询语句(select) e_3B\59k
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); "j=E8Dd}
2)用PreparedStatement来执行sql语句 e]V7
7oc
String sql; YOUX
sql = "insert into user (id,name) values (?,?)"; ~oRT@E
PreparedStatement ps = cn.prepareStatement(sql); 5IbCE.>iU
ps.setInt(1,xxx); wif1|!aL
ps.setString(2,xxx); 5.lg*vh
... -5@hU8B'a
ResultSet rs = ps.executeQuery(); // 查询 1|$J>
int c = ps.executeUpdate(); // 更新 *nwH1FjH
b[MKo7
3、处理执行结果 B8>@q!G8P
查询语句,返回记录集ResultSet nE4rB\
更新语句,返回数字,表示该更新影响的记录数 }'h\;8y
ResultSet的方法 d,o|>e$
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Us3zvpy)o
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 .~|[*
q\
;bFd*8?;
4、释放连接 `*cJc6
cn.close(); 8Y;2.Z`Rz
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection g>{t>B%v^K
j+2-Xy'
可滚动、更新的记录集 <4N E)!#
1、创建可滚动、更新的Statement Q;kl-upn~8
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); qKs"L^b
该Statement取得的ResultSet就是可滚动的 n.1$p
2、创建PreparedStatement时指定参数 uIR
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); u\)q.`
ResultSet.absolute(9000); }+F@A`Bm&
批量更新 5Trc#i<\
1、Statement Iz&<rL;s
Statement sm = cn.createStatement(); '<AE%i,
sm.addBatch(sql1); (mx}6A
sm.addBatch(sql2); !ozHS_
... 9 $zx<O
sm.executeBatch() vyT-!mC
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 $LtCI
2、PreparedStatement >n%ckL|rG
PreparedStatement ps = cn.preparedStatement(sql); Kp6%=JjO
{ UL xgvq
ps.setXXX(1,xxx); l;h5Y<A%?
... *7),v+ET
ps.addBatch(); GZ.KL!,R!
} cpx:4R,
ps.executeBatch(); U \jFB*U
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 0VIR=Pbp
|C7=$DgwY
事务的处理 %
xBQX
1、关闭Connection的自动提交 }1NNXxQ
cn.setAutoCommit(false); ;s5JYR
2、执行一系列sql语句 I3 YSW
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 3
op{h6
Statement sm ; th+LScOX
sm = cn.createStatement(insert into user...); K\5/ ||gi
sm.executeUpdate(); ge%tj O
sm.close(); m21H68y
sm = cn.createStatement("insert into corp...); cZAf?,>u
sm.executeUpdate(); v=-T3
n
sm.close(); +KIFLuL
3、提交 ][>-r&V
cn.commit(); L"(
{6H
4、如果发生异常,那么回滚 K pmq C$
cn.rollback();