java 数据库基本操作 u zL|yxt
1、java数据库操作基本流程 i}@5<&J
2、几个常用的重要技巧: m}+_z^@j9
可滚动、更新的记录集 lM.k*`$
批量更新 Kir|in)r0
事务处理 :@S=0|:j
02C;
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 A+VzpJ~
1、取得数据库连接 ^+Njz{rpG
1)用DriverManager取数据库连接 z5W;-sCz
例子 J7k=5Fqej;
String className,url,uid,pwd; zwK$ q=-:
className = "oracle.jdbc.driver.OracleDriver"; W3&~[DS@~
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Ox6^=D"
uid = "system"; TSj)XU {W
pwd = "manager"; aZCxyoh +
Class.forName(className); D!D}mPi[
Connection cn = DriverManager.getConnection(url,uid,pwd); 1~[GGl
2)用jndi(java的命名和目录服务)方式 ~e=KBYDBu
例子 S9 @*g3
String jndi = "jdbc/db"; 5K00z?kD2V
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); M] W5%3do
DataSource ds = (DataSource) ctx.lookup(jndi); LP) IL~
Connection cn = ds.getConnection(); QY$4D;M`g6
多用于jsp中 ^?T,>ZI
2、执行sql语句 Q`Ug tL
1)用Statement来执行sql语句 Nrc-@ ]
String sql; >Vb V<ak
Statement sm = cn.createStatement(); ;(IAhWE?7
sm.executeQuery(sql); // 执行数据查询语句(select) =h}PL22
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); '>>@I~<\
2)用PreparedStatement来执行sql语句 n;k
B_i*l
String sql; I bE Nq
sql = "insert into user (id,name) values (?,?)"; w^/"j_p@
PreparedStatement ps = cn.prepareStatement(sql); ;h#CT#R2
ps.setInt(1,xxx); M \>5" ,0
ps.setString(2,xxx); `7'=~BP?X
... [H>/N7v19*
ResultSet rs = ps.executeQuery(); // 查询 ,62BZyT,T,
int c = ps.executeUpdate(); // 更新 J=ot&%
fw0Z- 9*
3、处理执行结果 N~B'gJJDx
查询语句,返回记录集ResultSet N}q*(r!q<
更新语句,返回数字,表示该更新影响的记录数 r8!M8Sc
ResultSet的方法 +N!/>w]n
1、next(),将游标往后移动一行,如果成功返回true;否则返回false |sDp>..
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 sJ|IW0Mr
7/BA!V(na
4、释放连接
DIh[%
cn.close(); -3C$br
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection F-Ywl)
~PC S_
可滚动、更新的记录集 T7Yg^ -"
1、创建可滚动、更新的Statement E5$uvxCI
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ;MjOs&1f0K
该Statement取得的ResultSet就是可滚动的 fwaM ;YN_
2、创建PreparedStatement时指定参数 ,tuZ_"?M
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ; T WYO
ResultSet.absolute(9000); AI2 >{V
批量更新 #K/#-S
1、Statement rE\.[mFI
Statement sm = cn.createStatement(); (rSBzM]H
sm.addBatch(sql1); {1W,-%
sm.addBatch(sql2); }fz;La:b
... \fL:Ie
sm.executeBatch() dH0wVI<z
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ]yA_N>k2K
2、PreparedStatement RQ[6svfP
PreparedStatement ps = cn.preparedStatement(sql); uB35CRd
{ k!m9
l1x
ps.setXXX(1,xxx); P87qUC
... If(IG]>`D
ps.addBatch(); SL>0 _
} ;EfREfk
ps.executeBatch(); Mhg_z.Z
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 {NV=k%MTmi
(1Ii86EP
事务的处理 !6d`e"\K
1、关闭Connection的自动提交 cGe-|>:
cn.setAutoCommit(false); +)TOcxF%
2、执行一系列sql语句 yy|F6Pq3`
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close AN-;*n<'
Statement sm ; @KC;"u'C
sm = cn.createStatement(insert into user...); 6w^Fee`>]
sm.executeUpdate(); gNzamorv[
sm.close(); \+sP<'~M
sm = cn.createStatement("insert into corp...); :KJZo,\
sm.executeUpdate(); N^K@$bs4^
sm.close(); CT#N9
3、提交 A+F@JpV
cn.commit(); XxE>KeP
4、如果发生异常,那么回滚 n7K\\|X
cn.rollback();