java 数据库基本操作 fb{``,nO
1、java数据库操作基本流程 Pa~)"u8
2、几个常用的重要技巧: R{ a"Y$
可滚动、更新的记录集 Q^
pmQ
批量更新 B[V+ND'(
事务处理 U<CTubF
p1&b!*o- &
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 7g%E`3)"
1、取得数据库连接 Z?%zgqTXb
1)用DriverManager取数据库连接 &K.?p2$X
例子 (vb
SM}P
String className,url,uid,pwd; }oL'8-y
className = "oracle.jdbc.driver.OracleDriver"; qOSM}ei>s
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; QV{}K
uid = "system"; K{[%7AM
pwd = "manager"; 4<% *E{`
Class.forName(className); nq6@6GRG
Connection cn = DriverManager.getConnection(url,uid,pwd); >N]7IU[-
2)用jndi(java的命名和目录服务)方式 yp$_/p O=2
例子 %]>KvoA
String jndi = "jdbc/db"; pgOQIzu
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); KO]T<R
h<
DataSource ds = (DataSource) ctx.lookup(jndi); eu(:`uu
Connection cn = ds.getConnection(); nHm}zOLc
多用于jsp中 MFb9H{LA
2、执行sql语句 ;~"FLQg@
1)用Statement来执行sql语句 Wzw7tLY._
String sql; ,QcF|~n
Statement sm = cn.createStatement(); 8>0e*jC
sm.executeQuery(sql); // 执行数据查询语句(select) XzIl`eH
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); j#+!\ft5
2)用PreparedStatement来执行sql语句 Fxm$9(Y
String sql; 1UE6 4Kl:S
sql = "insert into user (id,name) values (?,?)"; dYL"h.x
PreparedStatement ps = cn.prepareStatement(sql); qNYN-f~@,
ps.setInt(1,xxx); 4"(<X
ps.setString(2,xxx); S"xKL{5
... BZR:OtR^
ResultSet rs = ps.executeQuery(); // 查询 nPye,"A Ol
int c = ps.executeUpdate(); // 更新 :.$3vaZ@
}[4r4 1[
3、处理执行结果 YhDtUt}?
查询语句,返回记录集ResultSet 8=gjY\Dp
更新语句,返回数字,表示该更新影响的记录数 M+w=O!dq
ResultSet的方法 !"\80LP
1、next(),将游标往后移动一行,如果成功返回true;否则返回false J[4mLU
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 i70wrW#k
i'#E)
4、释放连接 xO&eRy?%
cn.close(); f}x.jxY?
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Bs O+NP
wM2*#
可滚动、更新的记录集 K%^V?NP*{Z
1、创建可滚动、更新的Statement fpFhn
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); %`&2+\`
该Statement取得的ResultSet就是可滚动的 ,M^ P!
2、创建PreparedStatement时指定参数 8C67{^`::
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
w-Da~[J
ResultSet.absolute(9000); vTJ}8
批量更新 %k'!Iq+
1、Statement @Ub"5Fl4
Statement sm = cn.createStatement(); J/[=p<I)
sm.addBatch(sql1); 0cJWJOj&
sm.addBatch(sql2); gK[YQXfTy
... @te!Jgu{
sm.executeBatch() >_|O1H./4
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 EUN81F?
2、PreparedStatement $shoasSuI
PreparedStatement ps = cn.preparedStatement(sql); .6`9H 1
{ &(xH$htv1
ps.setXXX(1,xxx); i 7x7xtq
... 4}4Pyjh
ps.addBatch(); A29gz:F(
} &NH$nY.r
ps.executeBatch(); m]5Cq6
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 F.w5S!5Q
G>1eFBh }
事务的处理 FW/W%^
1、关闭Connection的自动提交 M#As0~y
cn.setAutoCommit(false); ]
:BX!<
2、执行一系列sql语句 sB c
(gr
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Q\
U:~g3
Statement sm ; ;|vpwB@B
sm = cn.createStatement(insert into user...); <gJU?$
sm.executeUpdate(); ?kB2iU_f+
sm.close(); N4L|;?
sm = cn.createStatement("insert into corp...); j(RWO
sm.executeUpdate(); j^^Ap
sm.close(); =jX8.K4]
3、提交 1:f9J
cn.commit(); Z|5?7v;h5
4、如果发生异常,那么回滚 }>VG~u8
cn.rollback();