java 数据库基本操作 mzf+Cu:`v
1、java数据库操作基本流程 dtcIC0:[
2、几个常用的重要技巧: Q
!(pE&
可滚动、更新的记录集 ,Bal
批量更新 Gqy,u3lE
事务处理 q2et|QCru
'FS?a
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 :.45u}[
1、取得数据库连接 j<)9dEM'
1)用DriverManager取数据库连接 <,>P 0tY}
例子 :P(K2q3
String className,url,uid,pwd; 6MxKl
D7kl
className = "oracle.jdbc.driver.OracleDriver"; A21N|$[
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Jyqc2IH
uid = "system"; 4M^G`WA}t9
pwd = "manager"; Z" uY}P3
Class.forName(className); ,Uy|5zv
Connection cn = DriverManager.getConnection(url,uid,pwd); h@LHRMO
2)用jndi(java的命名和目录服务)方式 78/N
例子 r{rQu-|.
String jndi = "jdbc/db"; +fnK/%b
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); QQV~?iW{~
DataSource ds = (DataSource) ctx.lookup(jndi); xQ'2BAEa
Connection cn = ds.getConnection(); "|HDGA5
多用于jsp中 H8'Z#"h
2、执行sql语句 QurW/a
1)用Statement来执行sql语句 <!pvqNApg
String sql; "^1L'4'S
Statement sm = cn.createStatement(); 56Vb+0J'
sm.executeQuery(sql); // 执行数据查询语句(select) bk\yCt06y;
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); !0dNQ[$82
2)用PreparedStatement来执行sql语句 +
Q6l*:<|c
String sql; IEcf
sql = "insert into user (id,name) values (?,?)"; ,yTjU{<"
PreparedStatement ps = cn.prepareStatement(sql); b? j< BvQ
ps.setInt(1,xxx); 2^^=iU=!<|
ps.setString(2,xxx); zdp/|"D!
... ~wVd$%7`
ResultSet rs = ps.executeQuery(); // 查询 H~E(JLcU
int c = ps.executeUpdate(); // 更新 bl'z<S,
'
=k oSUVO0
3、处理执行结果 l#}.^71+
查询语句,返回记录集ResultSet XyOl:>%L!P
更新语句,返回数字,表示该更新影响的记录数
(X?/"lC)
ResultSet的方法 3ux0Jr2yT
1、next(),将游标往后移动一行,如果成功返回true;否则返回false "$}vP<SM
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 rgOfNVyJG<
p3}?fej&|
4、释放连接 K_ci_g":
cn.close(); 1NcCy!+
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection =?-ye!w
%~QO8q_7
可滚动、更新的记录集 .n=Z:*JqQ
1、创建可滚动、更新的Statement EFc-foN
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Q3y;$ "
该Statement取得的ResultSet就是可滚动的 $*W6A/%O
2、创建PreparedStatement时指定参数 NVl [kw
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); dqX;#H}h
ResultSet.absolute(9000); e*.b3z
批量更新 2mq$H_
1、Statement H&yD*@
Statement sm = cn.createStatement(); I=!rbF;Z
sm.addBatch(sql1); ZlojbL@|4
sm.addBatch(sql2); QL$S4 J"
... U bYEEY#
sm.executeBatch() oQL59XOT4
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 x[Wwq=~
2、PreparedStatement @+WQ ^
PreparedStatement ps = cn.preparedStatement(sql); *;XWLd#
{ wlPx,UqZ
ps.setXXX(1,xxx); 2+Wzf)tB
... $.:mai
ps.addBatch(); >dM8aJzC
} WW@d:R
ps.executeBatch(); EbZdas!l
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ]1gx#y 2
p)~lL
事务的处理 <s@-:;9~
1、关闭Connection的自动提交 _e7-zg$/
cn.setAutoCommit(false); c)7j QA
2、执行一系列sql语句 @WKzX41'
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close T{}fHfM
Statement sm ; d
HJhFw
sm = cn.createStatement(insert into user...); D\ H/
sm.executeUpdate(); cUO<.
sm.close(); Urgtg37
sm = cn.createStatement("insert into corp...); 4c+$%pq5
sm.executeUpdate(); tW;:-
sm.close(); OD=!&LM
3、提交 a1j.fA
cn.commit(); &J!aw
4、如果发生异常,那么回滚 fKtV'/X;Q
cn.rollback();