java 数据库基本操作 yE{l
Xp;
1、java数据库操作基本流程 U87VaUr
2、几个常用的重要技巧: *h@nAB\3
可滚动、更新的记录集 <saS2.4
批量更新 )#xd]~<
事务处理 dm8veKW'l
:*0k:h6g
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ;yBq'_e3
1、取得数据库连接 Y 0$m~}j
1)用DriverManager取数据库连接 wD22@uM#]
例子 9} eIidw K
String className,url,uid,pwd; q>]v~
className = "oracle.jdbc.driver.OracleDriver"; ` *$^rQS
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ;=_<\2
uid = "system"; C]A*B
pwd = "manager"; N]KqSpPh
Class.forName(className); Q]{DhDz?+
Connection cn = DriverManager.getConnection(url,uid,pwd); 7yeZ+lD
2)用jndi(java的命名和目录服务)方式 PM[6U#
例子 e7]IEBbX2O
String jndi = "jdbc/db"; {Y`0}
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); rya4sxCh
DataSource ds = (DataSource) ctx.lookup(jndi); s^L\hr
Connection cn = ds.getConnection(); 6;*tw i
多用于jsp中 @#*B|lHE
2、执行sql语句 R?Iv<(I
1)用Statement来执行sql语句 $v-lG(
String sql; &fiDmUxj
Statement sm = cn.createStatement(); |I)MsNF
sm.executeQuery(sql); // 执行数据查询语句(select) a9FlzR
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close();
[GU!],Y
2)用PreparedStatement来执行sql语句 b.8HGt<%
String sql; hL67g
sql = "insert into user (id,name) values (?,?)"; &e cf5jFy
PreparedStatement ps = cn.prepareStatement(sql); #)my)}o\p
ps.setInt(1,xxx); ds5<4SLj
ps.setString(2,xxx); -S)HB$8
... :bLGDEC
ResultSet rs = ps.executeQuery(); // 查询 S9U9;>g
int c = ps.executeUpdate(); // 更新 }gag?yQ.^
q^(A6W
3、处理执行结果 *M"lUw#(f
查询语句,返回记录集ResultSet <ywxz1 i
更新语句,返回数字,表示该更新影响的记录数 FRs5 Pb1
ResultSet的方法 d<`Z{"g NS
1、next(),将游标往后移动一行,如果成功返回true;否则返回false
{3_M&$jN
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 dkG-Yz~
,i>5\Yl%
4、释放连接 U~Uxs\0:
cn.close(); *5*d8;@>
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection FZjtQ{M
k}F ;e_
可滚动、更新的记录集 p1J%=
1、创建可滚动、更新的Statement >'Y] C\
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); |\~cjPX(
该Statement取得的ResultSet就是可滚动的 P/M*XUG.
2、创建PreparedStatement时指定参数 $sGX%u
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ?y]3kU
ResultSet.absolute(9000); *!C^L"i
批量更新 Vi5RkUY]
1、Statement
M"X/([G
Statement sm = cn.createStatement(); "=P@x|I
sm.addBatch(sql1); xqbI~jV#
sm.addBatch(sql2); dgX 0\lKpf
... (VC{#^2l
sm.executeBatch() 1G{$ B^
f
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 j%[|XfM
2、PreparedStatement m"H9C-Y
PreparedStatement ps = cn.preparedStatement(sql); Xa9G;J$
{ h=d&@k\g
ps.setXXX(1,xxx); 4;w_o9o
... f{*G%
ps.addBatch(); ]E[Mv}
=
} #
?}WQP!
ps.executeBatch(); 3o"~_l$z
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 2MtaOG2l&q
5x=tOR/h
事务的处理 sI9~TZ :
1、关闭Connection的自动提交 rIS \#j
cn.setAutoCommit(false); ZuBVq
2、执行一系列sql语句 K'1rS[^>R
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close D$#=;H
,
Statement sm ; ~l{CUQU
sm = cn.createStatement(insert into user...); 1xT^ ,e6
sm.executeUpdate(); Rqvm%sAi
sm.close(); J]fjg%C2m
sm = cn.createStatement("insert into corp...); ?%oPWmj}
sm.executeUpdate(); I#uJdV|x
sm.close(); QVzLf+R~
3、提交 7Py8!
cn.commit(); "z@qG]#5
4、如果发生异常,那么回滚 (iBBdB
cn.rollback();