java 数据库基本操作 Sd'Meebu
1、java数据库操作基本流程 Bu?"b=B*
2、几个常用的重要技巧: :@g@jcbYq`
可滚动、更新的记录集 #$V`%2>
批量更新 =QEg~sD^)s
事务处理 rC] jz$sle
M52kau
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 J{72%S
1、取得数据库连接 .K^'Q|?
1)用DriverManager取数据库连接 2 cfzLW(
例子 ]7kq@o/7
String className,url,uid,pwd; ;cZ9C 1
className = "oracle.jdbc.driver.OracleDriver"; jeb<qi>
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; F=
uid = "system"; z79L2lJn
pwd = "manager"; |7WzTz
Class.forName(className); &|<~J(L;
Connection cn = DriverManager.getConnection(url,uid,pwd); .UbmU^y|
2)用jndi(java的命名和目录服务)方式 vj0`[X
例子 M"F?'zTkJ
String jndi = "jdbc/db"; #f]R:Ix>
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); W.p->,N
DataSource ds = (DataSource) ctx.lookup(jndi); GV)#>PL
Connection cn = ds.getConnection(); e1{t qNJ
多用于jsp中 QQ@, v@j5
2、执行sql语句 G}i\UXFE
1)用Statement来执行sql语句 ,
6\i
String sql; v}dt**l
Statement sm = cn.createStatement(); o*/\oVOq
sm.executeQuery(sql); // 执行数据查询语句(select) l ,)l"6OV
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); g92M\5
x9
2)用PreparedStatement来执行sql语句 S4<@ji
String sql; |
(P%<
sql = "insert into user (id,name) values (?,?)"; P,AS`=z
PreparedStatement ps = cn.prepareStatement(sql); Rf2/[
ps.setInt(1,xxx); `h5HA-ud
ps.setString(2,xxx); `g%]z@'+?
... aq"E@fb
ResultSet rs = ps.executeQuery(); // 查询 rBs7,h
int c = ps.executeUpdate(); // 更新 D+rDgrv
GSV,
3、处理执行结果 )Y~q6D K
查询语句,返回记录集ResultSet y<PPO6u7
更新语句,返回数字,表示该更新影响的记录数 d T/*O8
ResultSet的方法 "n
'*_rh>+
1、next(),将游标往后移动一行,如果成功返回true;否则返回false G/(oQA
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 fT._Os?i
O89<IXk
4、释放连接 9In&vF7$
cn.close(); R#tz"T@
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection WlP@Tm5g/
jLvI!q
可滚动、更新的记录集 LYh5f#
1、创建可滚动、更新的Statement P;KbS~ SlC
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); [OG-ZcNu?
该Statement取得的ResultSet就是可滚动的 O|,+@qtH
2、创建PreparedStatement时指定参数 Fhn883
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); `(;d+fof
ResultSet.absolute(9000); A4';((OXy
批量更新 V]H<:UE
1、Statement 7x9YA$IE
Statement sm = cn.createStatement(); &m8B%9w
sm.addBatch(sql1); cv:nlq)
sm.addBatch(sql2); CCq<y
... K1O/>dN_\O
sm.executeBatch() ml=1R>#'
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 <Q\`2{
2、PreparedStatement _1y|#o
PreparedStatement ps = cn.preparedStatement(sql); &\sg~
{ H?40yu2m5
ps.setXXX(1,xxx); R ;5w*e}?5
... iBJ*6orz
ps.addBatch(); *sJx0<!M}
} i[3$Wi$
ps.executeBatch(); #2yOqUO\
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 * VW\
ygpC1nN
事务的处理 Vu`dEvL?
1、关闭Connection的自动提交 tP!sOvQ:
cn.setAutoCommit(false); j K[VEhs
2、执行一系列sql语句 aSHZR
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close y#AY+
>
Statement sm ; &[cL%pP
sm = cn.createStatement(insert into user...); w])~m1yW
sm.executeUpdate(); >4M_jC.
sm.close(); N_pJE?
sm = cn.createStatement("insert into corp...); "G6d'xkP
sm.executeUpdate(); idO3/>R
[
sm.close(); w#PaN83+
3、提交 WS(@KN
cn.commit(); m OmT]X
4、如果发生异常,那么回滚 8GlH)J+kq
cn.rollback();