java 数据库基本操作 rlvo&(a
1、java数据库操作基本流程 uhFj|r$$
2、几个常用的重要技巧: 05\A7.iy
可滚动、更新的记录集 {iqH 27\E
批量更新 V=}b>Jo2j
事务处理 L_.BcRy
9IKFrCO9,
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 VN[h0+n4Th
1、取得数据库连接 /!kKL$j
1)用DriverManager取数据库连接 ;wfzlUBC
例子 Nt^R~#8hF>
String className,url,uid,pwd; mJu;B3@
className = "oracle.jdbc.driver.OracleDriver"; &WIiw$@
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; GQTMQXn(
uid = "system"; D5]sf>~
pwd = "manager"; H[guJ)4#@
Class.forName(className); i6zfr|`@
Connection cn = DriverManager.getConnection(url,uid,pwd); e`#c[lbAAM
2)用jndi(java的命名和目录服务)方式 Y?2I
/
例子 M`ETH8Su=
String jndi = "jdbc/db"; nBGFa
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); q@ >s#
DataSource ds = (DataSource) ctx.lookup(jndi); Z@=1-l
Connection cn = ds.getConnection(); :J-@+_J
多用于jsp中 <h2WM (n
2、执行sql语句 =uZ[
1)用Statement来执行sql语句 nJ#uz:(w,
String sql; ~jb6
Statement sm = cn.createStatement(); s% "MaDz
sm.executeQuery(sql); // 执行数据查询语句(select) /a%5!)NE%
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); &,xN$
2)用PreparedStatement来执行sql语句 u{'bd;.7
String sql; 5tg
sql = "insert into user (id,name) values (?,?)"; 1O1/P,u+
PreparedStatement ps = cn.prepareStatement(sql); 0A@'w*=
ps.setInt(1,xxx); 5B!l6ST
ps.setString(2,xxx); BF2,E<^A
... Dx =ms^oN5
ResultSet rs = ps.executeQuery(); // 查询 /i$
mIj`
int c = ps.executeUpdate(); // 更新 ^zHBDRsb2F
15_OtK
3、处理执行结果 _PrK6M@"L
查询语句,返回记录集ResultSet nZa.3/7dJ
更新语句,返回数字,表示该更新影响的记录数 z!5^UD8"W
ResultSet的方法 mxhO:.l
1、next(),将游标往后移动一行,如果成功返回true;否则返回false sn&y;Vc[$
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 `'[u%U E
LQ"56PP<
4、释放连接 F_=RY]
cn.close(); b w!;ZRK
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection [rv"tz=
5C/W_H+9iK
可滚动、更新的记录集 Lc6Wj'G
G
1、创建可滚动、更新的Statement {[PoLOCI
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 8/*q#j
该Statement取得的ResultSet就是可滚动的 Y25S:XHk9
2、创建PreparedStatement时指定参数 h8oG5|Y
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); $
+;`[b
ResultSet.absolute(9000); @CU3V+
批量更新 5YaTE<G
1、Statement OWFLw
Statement sm = cn.createStatement(); p q7G[
sm.addBatch(sql1); A^2VH$j]+
sm.addBatch(sql2); 3(':4Tas
... U[=VW0
sm.executeBatch() _h!OGLec
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 S,m)yh.
2、PreparedStatement '<~l%q
PreparedStatement ps = cn.preparedStatement(sql); j^T.7Zv
{ m
UpLD+-j
ps.setXXX(1,xxx); S,Boutd
... " 4#V$V
ps.addBatch(); 1HG~}E
} v!T%xUb0
ps.executeBatch(); V&<vRIsN
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ^$SI5WK&)
*VH!<k[n
事务的处理 fn
)m$\2
1、关闭Connection的自动提交 .v%H%z~Rl#
cn.setAutoCommit(false); sPn[FuT>+s
2、执行一系列sql语句 ~h6aw
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close
,F(nkbt
Statement sm ; mL`,v
WL/`
sm = cn.createStatement(insert into user...); 6+(g4MW
sm.executeUpdate(); ,qV8(`y_
sm.close(); +M! f}=H
sm = cn.createStatement("insert into corp...); pi:%Bd&F
sm.executeUpdate(); -`gqA%#+
sm.close(); Ub*Gv(Pg
3、提交 zE5%l`@|o
cn.commit(); 9(DS"fgC
4、如果发生异常,那么回滚 $-m@cObw!.
cn.rollback();