java 数据库基本操作 <sbu;dQ`
1、java数据库操作基本流程 +Ze}B*0
2、几个常用的重要技巧: hPkp;a #
可滚动、更新的记录集 =IZT(8
批量更新 ,)cM3nu
事务处理 L(6d&t'|-R
%uDi#x.
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 gT.sjd
1、取得数据库连接 C[cbbp
1)用DriverManager取数据库连接 .^`{1%
例子 aqZi:icFa
String className,url,uid,pwd; 7sCG^&Y
className = "oracle.jdbc.driver.OracleDriver"; [(i
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ~ah~cwmpS
uid = "system"; B`)BZ,#p
pwd = "manager"; >58YjLXb
Class.forName(className); [>I<#_^~
Connection cn = DriverManager.getConnection(url,uid,pwd); +fB5w?Rg
2)用jndi(java的命名和目录服务)方式 LH.]DVj
例子 uh0VFL*@
String jndi = "jdbc/db"; ;?Tbnn Wn
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); LVM%"sd?
DataSource ds = (DataSource) ctx.lookup(jndi); n`_{9R
Connection cn = ds.getConnection(); ,&A7iO
多用于jsp中 dl)Y'DI
2、执行sql语句 [\eeDa
1)用Statement来执行sql语句 Z?q]bSIT
String sql; C}j"Qi`
Statement sm = cn.createStatement(); N{!i=A
sm.executeQuery(sql); // 执行数据查询语句(select) {lzWrUGO
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); QW~E&B%
2)用PreparedStatement来执行sql语句 6Igz:eX
String sql; ,<_A2t 2
sql = "insert into user (id,name) values (?,?)"; 4\N;2N
PreparedStatement ps = cn.prepareStatement(sql); !qQl@j O
ps.setInt(1,xxx); y-b%T|p9
ps.setString(2,xxx); 1s&zMWC
... L<cx:Vz
ResultSet rs = ps.executeQuery(); // 查询 WDYeOtc
int c = ps.executeUpdate(); // 更新 NN{?z!
tKuwpT1Qc
3、处理执行结果 J1U/.`Oy
查询语句,返回记录集ResultSet 4"(Bu/24
更新语句,返回数字,表示该更新影响的记录数 EWhK0Vej=
ResultSet的方法 9rX&uP)j^#
1、next(),将游标往后移动一行,如果成功返回true;否则返回false $99n&t$Y
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 oCv.Ln1;Z
{w O|)|
4、释放连接 m])y.T
cn.close(); iq8<ov
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ;4\2.*s
ub0.J#j@
可滚动、更新的记录集 ?zMHP#i
1、创建可滚动、更新的Statement <NY^M!
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); `$IK`O
该Statement取得的ResultSet就是可滚动的 fplo w
2、创建PreparedStatement时指定参数 ys^oG$lq
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Lg+Ac5y}`
ResultSet.absolute(9000); +) om^e@.
批量更新 H|<[YYk
1、Statement ;8&3 dm]
Statement sm = cn.createStatement(); NiEUW.0
sm.addBatch(sql1); RLXL&
sm.addBatch(sql2); ,-LwtePJ0
... +o{R _
sm.executeBatch() M/'sl;
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 [S%_In
2、PreparedStatement O63<AY@
PreparedStatement ps = cn.preparedStatement(sql); 2wg5#i
{ )EuvRLo{S7
ps.setXXX(1,xxx); uAq~=)F>,
... ua$GNm
ps.addBatch(); e]"W!KcD9
} Fyx|z'4b
ps.executeBatch(); /Iy]DU8
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 A`$%SVgFV^
^mDe08.
%b
事务的处理 VcYrK4
1、关闭Connection的自动提交 ek\ xx
cn.setAutoCommit(false); rU:`*b<
2、执行一系列sql语句 /t57!&
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ~H_/zK6e
Statement sm ; nNV'O(x}
sm = cn.createStatement(insert into user...); =:Fc;n>c<K
sm.executeUpdate(); Fnv;^}\z
sm.close(); }eU*(
}<^
sm = cn.createStatement("insert into corp...); ~
'cmSiz-
sm.executeUpdate(); sf
qL|8
sm.close(); \ a<h/4#|
3、提交 k,6f
cn.commit(); jD]~ AwRJ
4、如果发生异常,那么回滚 N^G
Mp,8
cn.rollback();