java 数据库基本操作 / :6|)AW.{
1、java数据库操作基本流程 OmS8cSYGc
2、几个常用的重要技巧: n9n)eI)R
可滚动、更新的记录集 p@[ fZj
批量更新 ZY@ntV?
事务处理 P(/eVD#v
sx}S,aIU
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 !&NrbiuN
1、取得数据库连接 `uH7~ r^
1)用DriverManager取数据库连接 O;|Cu7WU
例子 kX8NRPW
String className,url,uid,pwd; &b7_%,Bx4
className = "oracle.jdbc.driver.OracleDriver"; |(.%`BTD
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; OA(.&5]
uid = "system"; P,9Pn)M|
pwd = "manager"; x":o*(rSQ
Class.forName(className); "Mhn?PTq
Connection cn = DriverManager.getConnection(url,uid,pwd); T[#q0bv
2)用jndi(java的命名和目录服务)方式 y%spI/(
例子 n?;rWq"
String jndi = "jdbc/db"; xu%eg]
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); K[LuvS
DataSource ds = (DataSource) ctx.lookup(jndi); )nFyHAy-
Connection cn = ds.getConnection(); >P&1or)e%
多用于jsp中 1@Ju sS0^K
2、执行sql语句 $EX(-!c
1)用Statement来执行sql语句 xV
2C4K
String sql; 7D4tuXUq2
Statement sm = cn.createStatement(); v^vi *c
sm.executeQuery(sql); // 执行数据查询语句(select) 4d-(:
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); KROD(
2)用PreparedStatement来执行sql语句 #<ST.f@*
String sql; C/'w
sql = "insert into user (id,name) values (?,?)"; `48Ql
PreparedStatement ps = cn.prepareStatement(sql); Y]](.\ff
ps.setInt(1,xxx); }a.j~>rq
ps.setString(2,xxx); u6Lx3
... HD/!J9&
ResultSet rs = ps.executeQuery(); // 查询 'W yWO^Bdk
int c = ps.executeUpdate(); // 更新 akU2ToP
{]Hv*{ ]
3、处理执行结果 /-G_0A2wF
查询语句,返回记录集ResultSet ai-rF^ehC
更新语句,返回数字,表示该更新影响的记录数 ,&qC
R
sw
ResultSet的方法 eZN"t~\rX
1、next(),将游标往后移动一行,如果成功返回true;否则返回false }m~MN4 l
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 @un+y9m[C
S2_(lS+R
4、释放连接 5j6`W?|q
cn.close(); ~!!|#A)W
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection |ns?c0rM
>]z^.U7=
可滚动、更新的记录集 Z6A-i@
1、创建可滚动、更新的Statement /XEW]/4
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); JXYZ5&[
该Statement取得的ResultSet就是可滚动的 > pP&/
2、创建PreparedStatement时指定参数 "=T&SY
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); dRnf
ResultSet.absolute(9000); XWyP'\
批量更新 _lFw1pa#\
1、Statement l
$"hhI8
Statement sm = cn.createStatement(); $2?j2}M
sm.addBatch(sql1); IA({RE
sm.addBatch(sql2); mbGma
... P(TBFu
sm.executeBatch() XclTyUGoK+
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 8.Y|I5l7G
2、PreparedStatement aR/?YKA
PreparedStatement ps = cn.preparedStatement(sql); \r[u>7I
{ =R|XFZ,
ps.setXXX(1,xxx); Y`Io}h G$
... W ';X4e
ps.addBatch(); i>s
} -p.\fvip
ps.executeBatch(); ZcQu9XDIt
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 DQm%=ON7
e)g&q'O
事务的处理 VL$
T
1、关闭Connection的自动提交 $
VP1(C
cn.setAutoCommit(false); hW<v5!,
2、执行一系列sql语句 G7Sw\wW
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close "cPg_-n
Statement sm ; z+yIP ?s}(
sm = cn.createStatement(insert into user...); C?T\5}h
sm.executeUpdate(); G+t:]\
sm.close(); eY5mwJ0K
sm = cn.createStatement("insert into corp...); Xa?O)Bq.
sm.executeUpdate(); b' y*\9Ru
sm.close(); EZ]4cd/i
3、提交 Kbf(P95+uL
cn.commit(); AXW.`~ 4
4、如果发生异常,那么回滚 Q>Zc
eJ;
cn.rollback();