java 数据库基本操作 y[;>#j$
1、java数据库操作基本流程 N~Jda
o
2、几个常用的重要技巧: yWK)vju"
可滚动、更新的记录集 A.SvA Yn
批量更新 ?,z}%p
事务处理 $Sq:q0
)lkjqFQ(
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 IGl9g_18
1、取得数据库连接 M`_0C38
1)用DriverManager取数据库连接 J.a]K[ci
例子 BmT! aue
String className,url,uid,pwd; i!Ba]n
className = "oracle.jdbc.driver.OracleDriver"; Gc?a +T
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; _BufO7`.
uid = "system"; K(4_a``05
pwd = "manager"; MgZ/(X E
Class.forName(className); 4#D,?eA7
Connection cn = DriverManager.getConnection(url,uid,pwd); Mx}gN:Wt
2)用jndi(java的命名和目录服务)方式 5P2K5,o|n~
例子 _a, s
)
String jndi = "jdbc/db"; \bXa&Lq
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); \fOEqe*5SM
DataSource ds = (DataSource) ctx.lookup(jndi); vx
=&QavL
Connection cn = ds.getConnection(); #!=tDc
&
多用于jsp中 VbYdZCC
2、执行sql语句 _ q"Gix
1)用Statement来执行sql语句 c<~H(k'+c
String sql; 6tZI["\
Statement sm = cn.createStatement(); awRX1:T#;O
sm.executeQuery(sql); // 执行数据查询语句(select) ~N4m1s"
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); _`X:jj>
2)用PreparedStatement来执行sql语句 Gv&V|7-f0
String sql; P \I|,
sql = "insert into user (id,name) values (?,?)"; P55fL-vo|}
PreparedStatement ps = cn.prepareStatement(sql); }>\C{ClI
ps.setInt(1,xxx); kh<2BOV
ps.setString(2,xxx); F4QVAOM]U
... :jf3HG
ResultSet rs = ps.executeQuery(); // 查询 kJU2C=m@e2
int c = ps.executeUpdate(); // 更新 6BlXLQ,8q
JF]JOI6.e
3、处理执行结果 4+n\k
查询语句,返回记录集ResultSet ?dTD\)%A
更新语句,返回数字,表示该更新影响的记录数 }p
V:M{Nu&
ResultSet的方法 /r 5eWR1G
1、next(),将游标往后移动一行,如果成功返回true;否则返回false y =@N|f!
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ZSw.U:ep$s
g(g& TO
4、释放连接 [g,}gyeS(
cn.close(); \V:^h[ad
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection z?zL9 7H
>_}
I.\X
可滚动、更新的记录集 !D6]JPX
1、创建可滚动、更新的Statement qs6aB0ln
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 3|7QUld
该Statement取得的ResultSet就是可滚动的 `cO:<^%
2、创建PreparedStatement时指定参数 4i bc
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); xw%0>K[
ResultSet.absolute(9000); {g6%(X\r.r
批量更新 b>k y
1、Statement M|-)GvR$J
Statement sm = cn.createStatement(); N`i/mP
sm.addBatch(sql1); `oJ [u:b
sm.addBatch(sql2); 2%1hdA<
... pAEx#ck
sm.executeBatch() :k"]5>(^
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Dq xs+
2、PreparedStatement s2?&!
PreparedStatement ps = cn.preparedStatement(sql); L];b<*d
{ rQX zR
ps.setXXX(1,xxx); X&zis1A<
... E`q_bn
ps.addBatch(); YIE<pX4Q7)
} 8L XHk l
ps.executeBatch(); :gT4K-Oj
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 6~{C.No}
zDp 2g)
事务的处理 Z)!C'c b
1、关闭Connection的自动提交 J4utIGF
cn.setAutoCommit(false); 6zkaOA46V
2、执行一系列sql语句 B!yr!DWv
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close dx]>(e@(t{
Statement sm ; /?!u{(h }
sm = cn.createStatement(insert into user...); <i[HbgUlO.
sm.executeUpdate(); q4q6c")zp
sm.close(); ex|F|0k4}
sm = cn.createStatement("insert into corp...); ijcm2FJcG
sm.executeUpdate(); PH"%kCI:
sm.close(); $(
)>g>%
3、提交 ?"FbsMk.d
cn.commit(); V :eD]zq5
4、如果发生异常,那么回滚 "b[5]Y{
U
cn.rollback();