java 数据库基本操作 |VBt:dd<
1、java数据库操作基本流程 3[YG
BM(
2、几个常用的重要技巧: qpjY &3SI
可滚动、更新的记录集 Hq3|>OqC2Q
批量更新 K$CC ~,D
事务处理 zC?'Qiuh*
@,vmX
z
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 DD|0?i
1、取得数据库连接 /sE,2X*BT
1)用DriverManager取数据库连接 :cT)M(o
例子 ~P4C`Q1PT#
String className,url,uid,pwd; $*Ucfw1T
className = "oracle.jdbc.driver.OracleDriver"; m5\T,
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; D!<F^mtl
uid = "system"; ]-=L7a
pwd = "manager"; ]%\,.&=hT
Class.forName(className); kB7vc>@1
Connection cn = DriverManager.getConnection(url,uid,pwd); 4ot<Uw5
2)用jndi(java的命名和目录服务)方式 %()d$.F
例子 %go2tv:|W
String jndi = "jdbc/db"; )H8_.]|
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ;Rrh$Ag
DataSource ds = (DataSource) ctx.lookup(jndi); P}bIp+
Connection cn = ds.getConnection(); LCF}Y{
多用于jsp中 j]u!;]
2、执行sql语句 \Z-th,t
1)用Statement来执行sql语句 y7Po$ )8l
String sql; 3uL
f0D
Statement sm = cn.createStatement(); >p_W(u@ z$
sm.executeQuery(sql); // 执行数据查询语句(select) Wn%P.`o#
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ?w3RqF@}
2)用PreparedStatement来执行sql语句 u?osX;'w
String sql; &5CRXf
sql = "insert into user (id,name) values (?,?)"; e~r/!B5X
PreparedStatement ps = cn.prepareStatement(sql); BI'>\hX/V
ps.setInt(1,xxx); _y@28t
ps.setString(2,xxx); |23F@s1
... wi(Y=?=
ResultSet rs = ps.executeQuery(); // 查询 ]vrZGX
a+
int c = ps.executeUpdate(); // 更新 Ln"wjO,
;kFD769DLw
3、处理执行结果 ClG%zE&i
查询语句,返回记录集ResultSet 2qMiX|Y
更新语句,返回数字,表示该更新影响的记录数 wQ_4_W
ResultSet的方法 ~#_~DqbMZ5
1、next(),将游标往后移动一行,如果成功返回true;否则返回false .<x6U*)\O
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ~Y 6'sM|
|/Nh#
4、释放连接 q<3nAE$?=
cn.close(); l|CM/(99-
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Z
3BwbH
z@*E=B1L
可滚动、更新的记录集 Kv_2=]H
1、创建可滚动、更新的Statement `Os=cMR
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); bI):-2&s}
该Statement取得的ResultSet就是可滚动的 qmS9*me
{
2、创建PreparedStatement时指定参数 mF4W4~"
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 5ggyk0
ResultSet.absolute(9000); |v&)O)Jg
批量更新 Xs03..S
1、Statement Tz
@<hE
Statement sm = cn.createStatement(); ``MO5${
sm.addBatch(sql1); >m%_`68
sm.addBatch(sql2); u$ts>Q;5
... g~lv/.CnA+
sm.executeBatch() 5Rbl.5.A
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 l6M?[
2、PreparedStatement &l(T},-X
PreparedStatement ps = cn.preparedStatement(sql); 7)?C+=,0
{ H2X_WSwm
ps.setXXX(1,xxx); @0 +\:F
... P1#g{f
ps.addBatch(); 5Xq+lLW>
} 2/-m-5A
ps.executeBatch(); ($di]lbsT
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 D8A+`W?
dOjly,!
事务的处理 pF;.nt)
1、关闭Connection的自动提交 .K
C*
(}-
cn.setAutoCommit(false); d$ouH%^cGu
2、执行一系列sql语句 HQ-[k$d
W4
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close WowKq0sn
Statement sm ; *5'8jC"2g
sm = cn.createStatement(insert into user...); xP8/1wd.
sm.executeUpdate(); 0h-NT\m
sm.close(); gtKih
sm = cn.createStatement("insert into corp...); D*l(p5[
sm.executeUpdate(); y?sz&*:
sm.close(); ak 7%
3、提交 \XDiw~0
cn.commit(); \f,<\mJ#
4、如果发生异常,那么回滚 }8'_M/u\
cn.rollback();