java 数据库基本操作 &Tl3\T0D
1、java数据库操作基本流程 S{&;
2、几个常用的重要技巧: +AXui|mn
可滚动、更新的记录集 %m{h1UQQ+
批量更新 WG1x:,-
事务处理 l? 7D0
d)9=hp;,V
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 o2&mhT
1、取得数据库连接 ,@(lYeD"
1)用DriverManager取数据库连接 z!?xz
例子 $1/yc#w
u
String className,url,uid,pwd; |"\A5v|1
className = "oracle.jdbc.driver.OracleDriver"; 4fp}`U
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 7!z0)Ai_>=
uid = "system"; !~PV\DQN
pwd = "manager"; I+ydVj(Op
Class.forName(className); W!htCwnkF
Connection cn = DriverManager.getConnection(url,uid,pwd); .y|*
2)用jndi(java的命名和目录服务)方式 A)'{G
例子 M/ >^_zG
String jndi = "jdbc/db"; bm`x
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); X8y&|uH
DataSource ds = (DataSource) ctx.lookup(jndi); 7oK!!Qd^w
Connection cn = ds.getConnection(); #8rLB(
多用于jsp中 =5',obYN>c
2、执行sql语句 :[,-wZiT~6
1)用Statement来执行sql语句 D8G5,s-.
String sql; ;MR8E9
Statement sm = cn.createStatement(); f{G
^b&x
sm.executeQuery(sql); // 执行数据查询语句(select) AwUc U;"9>
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); h 5<46!P
2)用PreparedStatement来执行sql语句 42~tdD
String sql; (HDR}!.E
sql = "insert into user (id,name) values (?,?)"; i=nd][1n
PreparedStatement ps = cn.prepareStatement(sql); h b_"E, `F
ps.setInt(1,xxx); B[epI3R
ps.setString(2,xxx); Y'mtMLfMc
... =g
UOHH
ResultSet rs = ps.executeQuery(); // 查询 RGf&KV/
int c = ps.executeUpdate(); // 更新 RG0kOw0
-LhO
</l
3、处理执行结果 J<yt/V]
查询语句,返回记录集ResultSet o7;lR?
更新语句,返回数字,表示该更新影响的记录数 lvY[E9I0
ResultSet的方法 W 2&o'(P\
1、next(),将游标往后移动一行,如果成功返回true;否则返回false
6g576
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 +<a-;e{
P XKEqcQR
4、释放连接 l1l=52r
cn.close(); jEVDz
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection g1Ed:V]_
m%]1~b}"
可滚动、更新的记录集 o#fr5>h-w
1、创建可滚动、更新的Statement TkBHlTa"=
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); gNUYHNzDM(
该Statement取得的ResultSet就是可滚动的 u%!/-&?wF
2、创建PreparedStatement时指定参数 GRM6H|.
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ;G.5.q[A
ResultSet.absolute(9000); ($'W(DH4
批量更新 2RG6m=Y8y
1、Statement ~G,_4}#"pM
Statement sm = cn.createStatement(); w;W# 'pE
sm.addBatch(sql1); ]l>LU2 sx
sm.addBatch(sql2); %PM&`c98z7
... "ngULpb{R
sm.executeBatch() JlR$"GU
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ~@ =(#tO.
2、PreparedStatement n+MWny
PreparedStatement ps = cn.preparedStatement(sql); +fS<YT
{ <-;/,uu
ps.setXXX(1,xxx); ,cE yV74
... `,QcOkvbC
ps.addBatch(); _t&`T
} %e^GfZ
ps.executeBatch(); V^Y'!w\LGI
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 2[j(C
/9ctmW1!<
事务的处理 U}@xMt8@l
1、关闭Connection的自动提交 *IX<&u#
cn.setAutoCommit(false); v|\3FEu@
2、执行一系列sql语句 aKjP{Z0k$
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 5(>SFxz"t
Statement sm ; ,2YZB*6h{
sm = cn.createStatement(insert into user...); MH=7(15R
sm.executeUpdate(); P q0%oz
sm.close(); .V4-
sm = cn.createStatement("insert into corp...); (Zg'])
sm.executeUpdate(); 50_[n$tqE
sm.close(); plL|Ubn
3、提交
J-#V_TzJ?
cn.commit(); NNt
n
4、如果发生异常,那么回滚 i/j53towe
cn.rollback();