java 数据库基本操作 Y_lCcu#OA
1、java数据库操作基本流程 R `Q?J[e
2、几个常用的重要技巧: u'Pn(A@1R
可滚动、更新的记录集 jl@K!=q
批量更新 /MxCvEE
事务处理 Te}IMi:
W_D%|Ub2X
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 C~_q^fXJt
1、取得数据库连接 ee\Gl?VN
1)用DriverManager取数据库连接 YiNo#M91
例子 c#x7N9;"!
String className,url,uid,pwd; @`2ozi~lO
className = "oracle.jdbc.driver.OracleDriver"; ] - h|]
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; nOr"K;C
uid = "system"; -;S3|
pwd = "manager"; .m'N7`VB
Class.forName(className); c8\g"T
Connection cn = DriverManager.getConnection(url,uid,pwd); skSNzF7'
2)用jndi(java的命名和目录服务)方式 3H <`Z4;
例子 gQCC>8
String jndi = "jdbc/db"; C=EhY+5
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 8fEAYRGd
DataSource ds = (DataSource) ctx.lookup(jndi); Oo$%Yh51~
Connection cn = ds.getConnection(); eo]a'J9(
多用于jsp中 MHn&;
A]
2、执行sql语句 3]7ipwF2q
1)用Statement来执行sql语句 `7$Oh{67
String sql;
,gx$U@0Z
Statement sm = cn.createStatement(); ^EUQ449<p
sm.executeQuery(sql); // 执行数据查询语句(select) ^CX,nj_(
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); /Sh4pu"'
2)用PreparedStatement来执行sql语句 IjgBa-o/V
String sql; MIJ%_=sm4:
sql = "insert into user (id,name) values (?,?)"; '[xut1{
PreparedStatement ps = cn.prepareStatement(sql); A7e_w
7?a
ps.setInt(1,xxx); Qvs(Rt3?y
ps.setString(2,xxx); 2nYiG)tg
... roL]v\tr
ResultSet rs = ps.executeQuery(); // 查询 G dL4|xv
int c = ps.executeUpdate(); // 更新 3XBp6`
GMt)}Hz
3、处理执行结果 25w6KBTe;:
查询语句,返回记录集ResultSet Ic_t c
更新语句,返回数字,表示该更新影响的记录数 H8x:D3C0
ResultSet的方法 1=- X<M75
1、next(),将游标往后移动一行,如果成功返回true;否则返回false [)bz6\d[
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 :az!H"4W/
xQZMCd
4、释放连接 <vO8_2,V-
cn.close(); <w%DyRFw3
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection c|3h|
Dt
(:u,%
可滚动、更新的记录集 s2wwmtUCN
1、创建可滚动、更新的Statement 5Bzuj`
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); .v$ue`
该Statement取得的ResultSet就是可滚动的 IcO9V<Q|
2、创建PreparedStatement时指定参数 &0FpP&Z(
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); e(4bx5<*
ResultSet.absolute(9000); =/M$
<+
批量更新 zww?
1、Statement cRjL3
Statement sm = cn.createStatement(); !~Ax
sm.addBatch(sql1); B44]NsYks~
sm.addBatch(sql2); i:AjWC@]
... {lTR/
sm.executeBatch() H,/~=d:
^
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ?%_]rr9
2、PreparedStatement [%7IQ4`{
PreparedStatement ps = cn.preparedStatement(sql); ysQEJm^|-u
{ 8UjCX[v
ps.setXXX(1,xxx); t
Qp*'
... .[]{
Q
ps.addBatch(); ~mHXz
} ^ON-#
ps.executeBatch(); ]i9H_K
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 R4[. n@
MM/BJ
事务的处理 vK[v
eFH
1、关闭Connection的自动提交 tP/GDC;
cn.setAutoCommit(false); O[3q9*(
2、执行一系列sql语句 a-SB1-5jf
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close {^2({A#&
Statement sm ; I67k M{V
sm = cn.createStatement(insert into user...); zDKLo 3:
sm.executeUpdate(); )^V5*#69D
sm.close(); VGkW3Nt0
sm = cn.createStatement("insert into corp...); Xd90n>4S
sm.executeUpdate(); l;"ub^AH
sm.close(); 7r:nMPX
3、提交 6C@0[Q\ER
cn.commit(); }UJdE#4
4、如果发生异常,那么回滚 }7f 1(#{7
cn.rollback();