java 数据库基本操作 leg@ia
1、java数据库操作基本流程 S2;{)"mS
2、几个常用的重要技巧: aq0J }4U
可滚动、更新的记录集 )}]<o
|'
批量更新 AL&}WbUC
事务处理 r/Qq-1E
+\\*Iy'xK
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Apa)qRJd
1、取得数据库连接 :hjeltt
1)用DriverManager取数据库连接 -r/# 20Y
例子 UVxE~801Y
String className,url,uid,pwd; Ajs<a(,6
className = "oracle.jdbc.driver.OracleDriver"; TB*g$*
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 8 y/YX
uid = "system"; toX4kmC
pwd = "manager"; l/DV
?27
Class.forName(className); s7D_fv4e
Connection cn = DriverManager.getConnection(url,uid,pwd); 0F0V JE
2)用jndi(java的命名和目录服务)方式 8Rc4+g
例子 FWq6e,
String jndi = "jdbc/db"; 0r_8/|N#
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); /^P^K
DataSource ds = (DataSource) ctx.lookup(jndi); ;!Ojb
Connection cn = ds.getConnection(); T,`'qZ>
多用于jsp中 MDGcK/$')f
2、执行sql语句 --Dw8FR9
1)用Statement来执行sql语句 A
WMR0I
String sql; }sd-X`lZ
Statement sm = cn.createStatement(); xAjLn*d|N
sm.executeQuery(sql); // 执行数据查询语句(select) vObP(@0AM
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); j<R,}nmD3\
2)用PreparedStatement来执行sql语句 va95/(
String sql; %R7Q`!@8
sql = "insert into user (id,name) values (?,?)"; V7[Dvg:W
PreparedStatement ps = cn.prepareStatement(sql); [qIi_(%o
ps.setInt(1,xxx); xQk]a1
ps.setString(2,xxx); \G#Qe*"'K
... ;6e#W!
ResultSet rs = ps.executeQuery(); // 查询 `(_cR@\
int c = ps.executeUpdate(); // 更新 n-}:D<\7
(+>+@G~o
3、处理执行结果 67<zBw2
查询语句,返回记录集ResultSet V/"XC3/n*
更新语句,返回数字,表示该更新影响的记录数 0u'4kF!P!
ResultSet的方法 =yz#L@\!
1、next(),将游标往后移动一行,如果成功返回true;否则返回false -l`@pklQ
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 )>\J~{
&oWWc$
4、释放连接 ~V`D@-VND
cn.close(); &A*oQ3
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection $P866F
?\<2*sW [k
可滚动、更新的记录集 C$"jZcm,I
1、创建可滚动、更新的Statement rPaD#GA[7
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); j<szQ%tJlI
该Statement取得的ResultSet就是可滚动的 P>)-uLc~W
2、创建PreparedStatement时指定参数 YRG+I GX
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 7. G
ResultSet.absolute(9000); +y6|Nq
批量更新 >m:.5][yu
1、Statement Zj<oh8
Statement sm = cn.createStatement(); W ;P1T"*A
sm.addBatch(sql1); "<v_fF<Y
sm.addBatch(sql2); @7u4v%,wB
... Eh!%NeO
sm.executeBatch() ,h#!!j\j6
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ?OZbns~
2、PreparedStatement Ook3B
PreparedStatement ps = cn.preparedStatement(sql); hO;bnt%(
{ cuq7eMG6z
ps.setXXX(1,xxx); @tEVgyN
... smIZ:L%
ps.addBatch(); "sAR<5b
} thipfS
ps.executeBatch(); %f6l"~y
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 w?jmi~6
7 z<!2
事务的处理 /nv1.c)k
1、关闭Connection的自动提交 reu[}k ~
cn.setAutoCommit(false); IH\k_Yf#u
2、执行一系列sql语句 iBp 71x65
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close P^rSpS9
Statement sm ; E0xUEAO
sm = cn.createStatement(insert into user...); $rFv(Qc^=
sm.executeUpdate(); 9'8OGCN
sm.close(); 0a8nBo7A-X
sm = cn.createStatement("insert into corp...); ^b-H
sm.executeUpdate(); z6Su`
sm.close(); )6bxP&k
3、提交 sn5N9=\+T
cn.commit(); Ct }"o
4、如果发生异常,那么回滚 hf:n!+,C
cn.rollback();