java 数据库基本操作 GT J{h
1、java数据库操作基本流程 z~\t|Z]G,|
2、几个常用的重要技巧: Ou>vX[{
可滚动、更新的记录集 4&cL[Ny
批量更新 |~
_'V "
事务处理 P%MfCpyj
,2]X}&{i
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 c)7j QA
1、取得数据库连接 2:LHy[{5
1)用DriverManager取数据库连接 d`
Sr4c
例子 j.:h5Y^N
String className,url,uid,pwd;
x3zj?-
className = "oracle.jdbc.driver.OracleDriver"; WGAXIQ
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; !7d*v3)d
uid = "system"; %5*@l vy
pwd = "manager"; U'*t~x<
Class.forName(className); BtY%r7^o
Connection cn = DriverManager.getConnection(url,uid,pwd); /Ky__l!bu
2)用jndi(java的命名和目录服务)方式 Ux2U*a;
例子 b5:op@V
String jndi = "jdbc/db"; \sA*V%n
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); }!i` 0p
DataSource ds = (DataSource) ctx.lookup(jndi); NS C/@._
Connection cn = ds.getConnection(); "<i SZ
多用于jsp中 CD0VfA>Z
2、执行sql语句 .O0O-VD+a
1)用Statement来执行sql语句 n$(p-po
String sql; /1`cRyS
Statement sm = cn.createStatement(); 9,]5v+
sm.executeQuery(sql); // 执行数据查询语句(select) X#w%>al
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ~3RC>8*Qw
2)用PreparedStatement来执行sql语句 90xk$3(
String sql; 0W^dhYO
sql = "insert into user (id,name) values (?,?)"; _e!F~V.
PreparedStatement ps = cn.prepareStatement(sql); F%rHU5CkV
ps.setInt(1,xxx); j'p1q
ps.setString(2,xxx); Pj?Dmk~
... s4H2/EC
ResultSet rs = ps.executeQuery(); // 查询 EC6k{y}bA
int c = ps.executeUpdate(); // 更新 4@;-%H&7
@uH#qg7
3、处理执行结果 _DP|-bp D
查询语句,返回记录集ResultSet ~svO*o Wa
更新语句,返回数字,表示该更新影响的记录数 MK}-<&v
ResultSet的方法 k#:2'!7G
1、next(),将游标往后移动一行,如果成功返回true;否则返回false #&,H"?"
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 rp7W
}P+uU
#hw/^AaD-
4、释放连接 b.2J]6G
cn.close(); 3_5XHOdE
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection W0cgI9=9
%}>dqUyQ
可滚动、更新的记录集 /Y^8SO4
1、创建可滚动、更新的Statement |vFj*XU
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); `3q;~ 9
该Statement取得的ResultSet就是可滚动的 DW(~Qdk
2、创建PreparedStatement时指定参数 0F;,O3Q
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ~2_lp^Y
ResultSet.absolute(9000); GQ_Ia\
批量更新 )fU(AXSP
1、Statement E&~nps8e
Statement sm = cn.createStatement(); P(omfD4
sm.addBatch(sql1); kVDe6},D7
sm.addBatch(sql2); xU9@$am
... ?HHzQ4w%{
sm.executeBatch() }PeZO!K
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 EqM;LgE=
2、PreparedStatement @\Js8[wS9@
PreparedStatement ps = cn.preparedStatement(sql); +K6szGP
{ g\M5:Qm
ps.setXXX(1,xxx); `^UK
... XT@Mzo49z\
ps.addBatch(); '7Ig.K&
} }{],GHCjQ
ps.executeBatch(); G\iyJSj[P
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 G{
mC7@
v
vE\
事务的处理 `3iQZui
1、关闭Connection的自动提交 1x >iz
`A
cn.setAutoCommit(false); KhM.Tc
2、执行一系列sql语句 :]eb<J
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Bo\D.a(T
Statement sm ; ,|To#umym>
sm = cn.createStatement(insert into user...); 2RppP?M!
sm.executeUpdate(); V{Q kN7-
sm.close(); NyPd5m:
sm = cn.createStatement("insert into corp...); }C(5 -7
sm.executeUpdate(); d$;/T('
sm.close(); s\0K o1
3、提交 @%W]".*'}
cn.commit(); Yr&Ka:
4、如果发生异常,那么回滚 @C.GKeM*
cn.rollback();