java 数据库基本操作 kD"dZQx
1、java数据库操作基本流程 x{RTI#a.
2、几个常用的重要技巧: $"x(:
可滚动、更新的记录集 4!iS"QH?;^
批量更新 i~k?k.t8
事务处理 WMl_$Fd6
$c f?`k
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 }RW4
1、取得数据库连接 BOfO$J}
1)用DriverManager取数据库连接 %Sxy!gGz%%
例子 \h_hd%'G
String className,url,uid,pwd; ${e(#bvGZ
className = "oracle.jdbc.driver.OracleDriver"; 9$S2:2(G
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; @AVx4,!>[
uid = "system"; uodO^5"-
pwd = "manager"; r}03&h~Hc&
Class.forName(className); 9.PY49|
Connection cn = DriverManager.getConnection(url,uid,pwd); H$\?D+xlf
2)用jndi(java的命名和目录服务)方式 ~+^,o_hT
例子 2yeq2v
String jndi = "jdbc/db"; {TUCa
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); y$\K@B4
DataSource ds = (DataSource) ctx.lookup(jndi); OJkPlDym
Connection cn = ds.getConnection(); 2ZLK`^S
多用于jsp中 :GGsQ
n
2、执行sql语句 ZOS{F_2.
1)用Statement来执行sql语句 0fNWI
String sql; x-Xb4?{
Statement sm = cn.createStatement(); 5nf|CQH6?
sm.executeQuery(sql); // 执行数据查询语句(select) ?55('+{l
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); AGrGZ7p]
2)用PreparedStatement来执行sql语句 &
}k=V4L
String sql; w)DO"Z7
sql = "insert into user (id,name) values (?,?)"; "D@m/l
PreparedStatement ps = cn.prepareStatement(sql); y]cx}9~
ps.setInt(1,xxx); ?86h:9
ps.setString(2,xxx); ilFM+x@
... dbnH#0i
ResultSet rs = ps.executeQuery(); // 查询 @/|sOF;8W
int c = ps.executeUpdate(); // 更新 :gQc@)jZ(*
D.$EvUSK<.
3、处理执行结果 t@)~{W
{
查询语句,返回记录集ResultSet `EWeJ(4Z@
更新语句,返回数字,表示该更新影响的记录数 Nnv&~D>
ResultSet的方法 2LD4f[a;
1、next(),将游标往后移动一行,如果成功返回true;否则返回false _k6N(c2Nd
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 HjnHl-
rr9HC]63
4、释放连接 ,wZ[Y
3
cn.close(); SOP=
X-6f
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection aY3kww`
_jeub [
可滚动、更新的记录集 =X% D;2
1、创建可滚动、更新的Statement T
0^U
]C
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); wl(}F^:/`
该Statement取得的ResultSet就是可滚动的 \6C"bQ
2、创建PreparedStatement时指定参数 r Ld,Izi
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Mc@p~5!M
ResultSet.absolute(9000); b\^ Sz{
批量更新 5{cAawU.
1、Statement 'OF)`5sj
Statement sm = cn.createStatement(); /a9+R)Al
sm.addBatch(sql1); vLpE|QZ s
sm.addBatch(sql2); W>1\f0'
... s'LG3YV-<
sm.executeBatch() )[qY|yu
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Zsf<)Vx
2、PreparedStatement guFR5>-L
PreparedStatement ps = cn.preparedStatement(sql); Fb-NG.Z#
{ LM*9b
ps.setXXX(1,xxx); -U;s,>\)
... KZD&Ih(vC
ps.addBatch(); tK8\Ib J
} E}"&?oY
ps.executeBatch(); %M'"%Yn@(y
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 hi.{
;B1}so1]
事务的处理 lkw[Z}\
1、关闭Connection的自动提交 M_*w)<
cn.setAutoCommit(false); e@F&/c
2、执行一系列sql语句 yChC&kX
Z+
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close q:?g?v
Statement sm ; 0imz}Z]
sm = cn.createStatement(insert into user...); uy`U1>
sm.executeUpdate(); '# (lq 5
c
sm.close(); ?$r+#'asd(
sm = cn.createStatement("insert into corp...); '*)!&4f
sm.executeUpdate(); U?>zq!C&R
sm.close(); ;#f%vs>Y7i
3、提交 faMUd#o&
cn.commit(); y{jv-&!xB
4、如果发生异常,那么回滚 )03.6Pvs
cn.rollback();