java 数据库基本操作 /4\wn?f
1、java数据库操作基本流程 7nq3S
2、几个常用的重要技巧: 4QOEw-~w&s
可滚动、更新的记录集 An*~-u9m
批量更新 `Z"Q^
事务处理 ~@ jY[_
7JJ/D4uT
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 wIB`%V
1、取得数据库连接 I
pzJ#
1)用DriverManager取数据库连接 b89a)k>^g
例子 $j}OB6^I
String className,url,uid,pwd; \%Ves@hG>
className = "oracle.jdbc.driver.OracleDriver"; 6z0@I*
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; XQ%4L-rhN
uid = "system"; 0& >H^
pwd = "manager"; 66x?A0P
Class.forName(className); $$APgj"|<
Connection cn = DriverManager.getConnection(url,uid,pwd);
HB+|WW t>
2)用jndi(java的命名和目录服务)方式 EtbnE*S
例子 b$%0.s
String jndi = "jdbc/db"; x<Vm5j
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 2d%}- nw
DataSource ds = (DataSource) ctx.lookup(jndi); ZF7IL
Connection cn = ds.getConnection();
@fv}G>t
多用于jsp中 ez]tAW
2、执行sql语句 <f@"HG
l
1)用Statement来执行sql语句 zZcnijWb
String sql; 40E#JF#
Statement sm = cn.createStatement(); k>x&Ip8p
sm.executeQuery(sql); // 执行数据查询语句(select) &k-Vcrcz
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); W[EKD 7
2)用PreparedStatement来执行sql语句 9O{b]=>wq
String sql; ~x#w<0e>
sql = "insert into user (id,name) values (?,?)"; J^R=dT!
PreparedStatement ps = cn.prepareStatement(sql); ~/^5) g_
ps.setInt(1,xxx); X@@8"@/u|*
ps.setString(2,xxx); WE]e
m
>
... dL7E<?l
ResultSet rs = ps.executeQuery(); // 查询 HbP!KVHyk1
int c = ps.executeUpdate(); // 更新 Hbv6_H
`qJw|u>YpJ
3、处理执行结果 K\"R&{+=
查询语句,返回记录集ResultSet W>-Et7&2
更新语句,返回数字,表示该更新影响的记录数 ;XM{o:1Y[
ResultSet的方法 4DZ-bt'
1、next(),将游标往后移动一行,如果成功返回true;否则返回false s3 7'&K
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 AJ#Nenmj
O G<,- 7
4、释放连接 iq(
)8nxi
cn.close(); L
"sO+4w
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection =UyLk-P
w
{( r6e
可滚动、更新的记录集 UAoh`6vFF8
1、创建可滚动、更新的Statement cGjPxG;
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); {o(j^@
该Statement取得的ResultSet就是可滚动的 N F)~W#
2、创建PreparedStatement时指定参数 H"A7Zo
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); H":oNpfb
ResultSet.absolute(9000); Ua!aaq&
批量更新 II6CHjW`;
1、Statement mI 74x3 [
Statement sm = cn.createStatement(); )"Ztlhs`#
sm.addBatch(sql1); $D G?M6
sm.addBatch(sql2); pK0"%eA
... P.gb1$7<
sm.executeBatch() sQkhwMg
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 13taFVdU
2、PreparedStatement @S|XGf
PreparedStatement ps = cn.preparedStatement(sql); 1GzAG;UUo6
{ ,v"YqD+GC5
ps.setXXX(1,xxx); 6Ybg^0m
... 21"1NJzP
ps.addBatch(); eJg8,7WC
} j]`PSl+w
ps.executeBatch(); 1I:+MBGin
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 O%bEB g
](hE^\SC
事务的处理 EFz&N\2
1、关闭Connection的自动提交 4EY)!?;
cn.setAutoCommit(false); h$2</J"
2、执行一系列sql语句 #\=F O>
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close % >=!p
Statement sm ; B
{>7-0
sm = cn.createStatement(insert into user...); ZHa"isl$e
sm.executeUpdate(); <Y}R#o1Z
sm.close(); wb0L.'jyR)
sm = cn.createStatement("insert into corp...); WlU0:(d
sm.executeUpdate(); VVlr*`
sm.close(); q<M2,YrbAI
3、提交 jyCXJa-!-
cn.commit(); q@{Bt{$x
4、如果发生异常,那么回滚 /'/Xvm3
cn.rollback();