java 数据库基本操作 [];*9vxW
1、java数据库操作基本流程 0b9;vlGq$
2、几个常用的重要技巧: #Jv|zf5Z
可滚动、更新的记录集 6fhH)]0
批量更新 s
l|n]#)
事务处理 Amf
gc>eJ
t@[&8j2B>
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 D.zEE-cGyb
1、取得数据库连接 P#(BdKjM
1)用DriverManager取数据库连接 +1R?R9^Fw
例子 -t_t3aU|
String className,url,uid,pwd; bT<if@h-
className = "oracle.jdbc.driver.OracleDriver"; n}MW# :eJe
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Yy6Mkw7X
uid = "system"; )-q#hY
pwd = "manager"; dd#=_xe
Class.forName(className); \jDD=ew
Connection cn = DriverManager.getConnection(url,uid,pwd); ufE;rcYE
2)用jndi(java的命名和目录服务)方式 >NWrT^rk
例子 yrOWC
String jndi = "jdbc/db"; ?!=yp#
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); :DTKZ9>2D
DataSource ds = (DataSource) ctx.lookup(jndi); 095:"GvO
Connection cn = ds.getConnection();
;LRY
h?
多用于jsp中 S"ZH5O(
2、执行sql语句 JsohhkJNGi
1)用Statement来执行sql语句 cRPW
String sql; ;/w-7O:
Statement sm = cn.createStatement(); QH:k5V~
sm.executeQuery(sql); // 执行数据查询语句(select) <rZ(B>$
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); K' xN>qc
2)用PreparedStatement来执行sql语句 9P;}P!W
String sql; xT7JGQ[|
sql = "insert into user (id,name) values (?,?)"; P` Hxj> {
PreparedStatement ps = cn.prepareStatement(sql); InnjZ>$
ps.setInt(1,xxx); @j*K|+X"
ps.setString(2,xxx); (3Hz=k_
... u`I&&
ResultSet rs = ps.executeQuery(); // 查询 ;i*<HNQ
int c = ps.executeUpdate(); // 更新 |
+osEHC
"]\sw"zO?
3、处理执行结果 D#}t)$"
查询语句,返回记录集ResultSet n qSjP5
更新语句,返回数字,表示该更新影响的记录数 ME"B1Se\
ResultSet的方法 n1+1/
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ?.tnaE
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ru#,pJ=O(
p4QQ5O$;
4、释放连接 qdkhfm2(K
cn.close(); Bw
_^"e8X
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 'B dZN
Z<L|WRe
可滚动、更新的记录集 cPD&xVwq>
1、创建可滚动、更新的Statement IE7%u92
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); }71a3EUK
该Statement取得的ResultSet就是可滚动的 \ng!qN
2、创建PreparedStatement时指定参数 `}t<5_
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); qxKW%{6o
ResultSet.absolute(9000); Dv~W!T i
批量更新 0LEJnl
1、Statement 84g$V}mp
Statement sm = cn.createStatement(); \)KLm
sm.addBatch(sql1); RCM;k;@8V
sm.addBatch(sql2); 1vKAJ<4W
... FXMrD,qVg
sm.executeBatch() Vwxb6,}Z
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 P2la/jN
2、PreparedStatement bMe/jQuL.$
PreparedStatement ps = cn.preparedStatement(sql); &QHZ]2%U
{ gR7in!8
ps.setXXX(1,xxx); D%[yAr;r
... mX8k4$z
ps.addBatch(); .[mI9dc
} ?8AV-rRX
ps.executeBatch(); v@m2c_,
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Rq`B'G9|c
P1cI]rriW
事务的处理 u!4i+7}
1、关闭Connection的自动提交 ViZ Tl~
cn.setAutoCommit(false); xF4S
2、执行一系列sql语句 VcI'+IoR?
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close [;6,lI}
Statement sm ; C_CUk d[
sm = cn.createStatement(insert into user...); (*qMs)~]B
sm.executeUpdate(); >\f'Q Q
sm.close(); 4FwtC"G3
sm = cn.createStatement("insert into corp...); `Vph=`0
sm.executeUpdate(); CMu/n]?c
sm.close(); ckDWY<@v
3、提交 b&wyp@k
cn.commit(); KZeaM
4、如果发生异常,那么回滚 ^w|D^F=o
cn.rollback();