java 数据库基本操作 h4`9Cfrq ,
1、java数据库操作基本流程 ~"dhu]^
2、几个常用的重要技巧: kBsXfVs9
可滚动、更新的记录集 ef]B9J~h
批量更新 '"xiS$b(
事务处理 ;VzMU ;j
8vD3=yK%^
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ME+em1ZH
1、取得数据库连接 e!0OW7kV
1)用DriverManager取数据库连接 +_m r
例子 []}N
String className,url,uid,pwd; vjlGX T`m
className = "oracle.jdbc.driver.OracleDriver"; iuAq.$oi{
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; }~I|t!GL
uid = "system"; KH<v@IJ\
pwd = "manager"; =ApY9`
Class.forName(className); .Q\\dESn"
Connection cn = DriverManager.getConnection(url,uid,pwd); F)ci9- b@
2)用jndi(java的命名和目录服务)方式 #A<"4#}
例子 U^$E'Q-VK
String jndi = "jdbc/db"; @ss):FwA
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); uqZ3Hyb
DataSource ds = (DataSource) ctx.lookup(jndi); BKb<2
Connection cn = ds.getConnection(); 9k>uRV6
多用于jsp中 Zu#<
2、执行sql语句 x_:hii?6V
1)用Statement来执行sql语句 Q[_Ni15
String sql; LDQ
e^
Statement sm = cn.createStatement(); NMXM[Ukb
sm.executeQuery(sql); // 执行数据查询语句(select)
GX38~pq
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); pxplWP,
2)用PreparedStatement来执行sql语句 YFvgz.>QE
String sql; n;OHH{E{
sql = "insert into user (id,name) values (?,?)"; aN'0}<s
PreparedStatement ps = cn.prepareStatement(sql); j|4tiv>
ps.setInt(1,xxx); /'&v4C^y>
ps.setString(2,xxx); 8=4^Lm
... 5$^c@ 0
ResultSet rs = ps.executeQuery(); // 查询 :,YLx9i>
int c = ps.executeUpdate(); // 更新 'j#a%j@{
-$R5
3、处理执行结果 D_ ug-<QT
查询语句,返回记录集ResultSet 2np-Fc{S
更新语句,返回数字,表示该更新影响的记录数 ]h8/M7k
ResultSet的方法 Cyf]`*
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Sip_~]hM
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 `~E<Sf<M
Q)dT(Td9~
4、释放连接 %:tr
cn.close(); Wa/geQE1<
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection k4mTZ}6E
7b,AQ9
可滚动、更新的记录集 *NjMb{[ZQ
1、创建可滚动、更新的Statement Z@nmjj i
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); UP*yeT,P,
该Statement取得的ResultSet就是可滚动的 |wJ),h8/
2、创建PreparedStatement时指定参数 VY{,x;O`
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ULrbQ}"cva
ResultSet.absolute(9000); 6\mC$: F
批量更新 ASM1Y]'Z
1、Statement .lG+a!)
Statement sm = cn.createStatement(); _!;\R7]
sm.addBatch(sql1); %\ _h7:
sm.addBatch(sql2); J{x##p<F$
... cuNq9y;[
sm.executeBatch() >rRjm+vg
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 lmp
R>@o"
2、PreparedStatement =ZrjK=K
PreparedStatement ps = cn.preparedStatement(sql); NN*Sb J0
{ >oB ?
ps.setXXX(1,xxx); :n`0)g[(
... b@F_7P%
ps.addBatch(); l58l
} [$H( CH`
ps.executeBatch(); M'vXyb%$1
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 LA>dkPB
A1 b6Zt
事务的处理 ;?j~8
1、关闭Connection的自动提交 qG*_w
RF
cn.setAutoCommit(false); `F@f?*s:
2、执行一系列sql语句 yT 2vO_rH
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close "rf\' 9=
Statement sm ; 0=gF6U
sm = cn.createStatement(insert into user...); {AtfK>D
sm.executeUpdate(); su%Z{f)#
sm.close(); k0=|10bi
sm = cn.createStatement("insert into corp...); WVsKrFZT
sm.executeUpdate(); {<~s&EPd
sm.close(); :az!H"4W/
3、提交 0L
7@2|a0
cn.commit(); HMFl/%z
4、如果发生异常,那么回滚 L5TNsLx (
cn.rollback();