java 数据库基本操作 @>cz$##`
1、java数据库操作基本流程 J;|a)Nw
2、几个常用的重要技巧: ose(#n4 0
可滚动、更新的记录集 ;G.5.q[A
批量更新 ($'W(DH4
事务处理 2RG6m=Y8y
~G,_4}#"pM
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 w;W# 'pE
1、取得数据库连接 ]l>LU2 sx
1)用DriverManager取数据库连接 %PM&`c98z7
例子 "ngULpb{R
String className,url,uid,pwd; JlR$"GU
className = "oracle.jdbc.driver.OracleDriver"; ~@ =(#tO.
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; n+MWny
uid = "system"; +fS<YT
pwd = "manager"; <-;/,uu
Class.forName(className); ,cE yV74
Connection cn = DriverManager.getConnection(url,uid,pwd); `,QcOkvbC
2)用jndi(java的命名和目录服务)方式 _t&`T
例子 %e^GfZ
String jndi = "jdbc/db"; =gNPS0H
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); n&OM~Vs
DataSource ds = (DataSource) ctx.lookup(jndi); '.EO+1{a
Connection cn = ds.getConnection(); %
bfe_k(
多用于jsp中 d^MRu#]
2、执行sql语句 J?{@pA
1)用Statement来执行sql语句 _Ne fzZWUJ
String sql; :aQ.:b(n
Statement sm = cn.createStatement(); )G#mC0?PV
sm.executeQuery(sql); // 执行数据查询语句(select) ~=va<%{
U
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ;NU-\<Q{
2)用PreparedStatement来执行sql语句 `6$|d,m5
String sql; )Zf1%h~0r
sql = "insert into user (id,name) values (?,?)"; 0vX4v)-^u
PreparedStatement ps = cn.prepareStatement(sql); xt_:R~/[
ps.setInt(1,xxx); aD]!
eP/)
ps.setString(2,xxx); wg%g(FO
... "i#aII+T
ResultSet rs = ps.executeQuery(); // 查询 % IHIXncv[
int c = ps.executeUpdate(); // 更新 "!+gA&
{ETM >
3、处理执行结果 Z_Wzm!:
查询语句,返回记录集ResultSet `AYq,3V
更新语句,返回数字,表示该更新影响的记录数 }@eIO|
ResultSet的方法 ])}a^]0q
1、next(),将游标往后移动一行,如果成功返回true;否则返回false (\0
<|pW
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Z1#u&oX
*Nm$b+
4、释放连接 ,qx^D
cn.close(); I4W@t4bZ
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection !O,Sq/=.
o]EL=j
可滚动、更新的记录集 vJL Gy]
1、创建可滚动、更新的Statement KL3Z(
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ? D
_kQl
该Statement取得的ResultSet就是可滚动的 wA\5-C7j
2、创建PreparedStatement时指定参数 z/u^
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 8N%nG(
0
ResultSet.absolute(9000); |BbzRis
批量更新 dvZH ~mF
1、Statement (:aU"5M
Statement sm = cn.createStatement(); dgL>7X=7
sm.addBatch(sql1); D/?Ec\t
sm.addBatch(sql2); NMe{1RM
... %xN${4)6
sm.executeBatch() v\GVy[Qyv
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 H4s~=iB
2、PreparedStatement gVrQAcJj
PreparedStatement ps = cn.preparedStatement(sql); J$Z=`=]t+
{ t;BUZE_!0c
ps.setXXX(1,xxx); }x?F53I)
... h%:rJ_#Zl
ps.addBatch(); 4;fuS_(X
} LRVcf
ps.executeBatch(); l% T4:p4e
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 RWc<CQcL"
#~!"`B?#*
事务的处理 `J1HQ!Z
1、关闭Connection的自动提交 E7t;p)x
cn.setAutoCommit(false); 7i*eKC`ZqK
2、执行一系列sql语句 ; h\T7pwwb
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ;xZjt4M1
Statement sm ; HcgvlFb
sm = cn.createStatement(insert into user...); 6$6QAW0+f
sm.executeUpdate(); ;eN
^'/4A
sm.close(); &W,jR|B
sm = cn.createStatement("insert into corp...); yEq7ueJ'
sm.executeUpdate(); TG%B:^Yz!
sm.close();
;%9]G|*{
3、提交 T1]?E]m{
cn.commit(); *!%lBt{2
4、如果发生异常,那么回滚 l-Z( ]
cn.rollback();