java 数据库基本操作 K)mQcB-"?
1、java数据库操作基本流程 %+Ze$c}X
2、几个常用的重要技巧: x51R:x(p
可滚动、更新的记录集 z8awND
批量更新 AQ@)'
事务处理 9QLG:(~;
cPuXye
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 1u7D:h>#
1、取得数据库连接 2;WbXc!#!
1)用DriverManager取数据库连接 .4[3r[
例子 ;J TY#)Bh
String className,url,uid,pwd; QCb%d'_w+
className = "oracle.jdbc.driver.OracleDriver"; e
}?.3,?
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 'xj5R=V
uid = "system"; <MkvlLu((o
pwd = "manager"; 0>7Ij7\[8
Class.forName(className); jK]1X8
Connection cn = DriverManager.getConnection(url,uid,pwd); S\N1qux{
2)用jndi(java的命名和目录服务)方式 j\~,Gtn>Z
例子 -'d:~:1f
String jndi = "jdbc/db"; jL^@;"/XhC
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 0Q&(j7`^@
DataSource ds = (DataSource) ctx.lookup(jndi); v{ >3)$1
Connection cn = ds.getConnection(); 4 O8ct,Y
多用于jsp中 4/`;(*]Fv
2、执行sql语句 (vZ-0Ep}
1)用Statement来执行sql语句 |_TI/i>?'
String sql; oC>J{z
Statement sm = cn.createStatement(); Fb]+h)on
sm.executeQuery(sql); // 执行数据查询语句(select) +`k30-<P
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 2 wY|E<E
2)用PreparedStatement来执行sql语句 >bf.T7wy
String sql; e7@ m i
sql = "insert into user (id,name) values (?,?)"; %5gdLm!p
PreparedStatement ps = cn.prepareStatement(sql); "Esl I
ps.setInt(1,xxx); D/."0 #q
ps.setString(2,xxx); H)D|lt5xy
... fF0i^E<
ResultSet rs = ps.executeQuery(); // 查询 H575W"53
int c = ps.executeUpdate(); // 更新 p lnH
Z5 IWoY
3、处理执行结果 5N|LT8P}Z
查询语句,返回记录集ResultSet 8eS(gKD
更新语句,返回数字,表示该更新影响的记录数 W34xrm
ResultSet的方法 zx}+Q B0
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ~hvj3zC5xz
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Deh3Dtg/k
(O0 Ry2uk
4、释放连接 )C8^'*!
cn.close(); AuXUD9-
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection $3HqVqF^R
NLMvi!5w,
可滚动、更新的记录集 gE2(E0H
1、创建可滚动、更新的Statement R|\eBnfI
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); fI)XV7,X
该Statement取得的ResultSet就是可滚动的 9u(pn`e 3
2、创建PreparedStatement时指定参数 F0U %m
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); nd8<*ru$
ResultSet.absolute(9000); Qt+D ,X
批量更新 rV%68x9
1、Statement Jj
\nye+
Statement sm = cn.createStatement(); \
=hg^j
sm.addBatch(sql1); eA!Z7 '
sm.addBatch(sql2); o7!A(Eu
... m|
,Tk:xH
sm.executeBatch() |KYl'"5\
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ,IPt4EH$
2、PreparedStatement zVS{X=u
PreparedStatement ps = cn.preparedStatement(sql); k2D*`\
D
{ z[c8W@OJ
ps.setXXX(1,xxx); 4P3RRS
... KY
ps.addBatch(); k={D!4kKz
} oDA'$]UL
ps.executeBatch(); 9!n:hhJM
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ,/+Mp
u;q
Q/Ftb
事务的处理 |D)CAQn,
1、关闭Connection的自动提交 mKe6rEUs|
cn.setAutoCommit(false); .:j{d}p}
2、执行一系列sql语句 ]eGa_Ld
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close {A0F/#M]
Statement sm ; %>*?uO`z[
sm = cn.createStatement(insert into user...); X
<xM '
sm.executeUpdate(); !}*vM@)1
sm.close(); u;t<rEC2
sm = cn.createStatement("insert into corp...); 4~Cf_`X}]
sm.executeUpdate(); j-1V,V=
sm.close(); { }/
3、提交 "QOQ
cn.commit(); `C>h]H(
4、如果发生异常,那么回滚 l\{Qnb(
cn.rollback();