java 数据库基本操作
aG!!z>
1、java数据库操作基本流程 g6S8@b))|
2、几个常用的重要技巧: \AG,dMS
可滚动、更新的记录集 ~![R\gps
批量更新 f;*\y!|lg~
事务处理 /<5/gV 1Q
tfsG
P]9$
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 DvGtO)5._
1、取得数据库连接 3j2}n
o8O
1)用DriverManager取数据库连接 H$ v4N8D8I
例子 SU1,+7"
String className,url,uid,pwd; 7 @ZL(G
className = "oracle.jdbc.driver.OracleDriver"; /3fo=7G6
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; *E>YLkg]
uid = "system"; !Bd2$y.
pwd = "manager"; ^#%[
Class.forName(className); +r '
Connection cn = DriverManager.getConnection(url,uid,pwd); 6sntwT"?
2)用jndi(java的命名和目录服务)方式 )g-*fSa
例子 <[*s%9)'9
String jndi = "jdbc/db"; b`IC)xN$
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); b]Jh0B~Y
DataSource ds = (DataSource) ctx.lookup(jndi); YVzK$k'3U
Connection cn = ds.getConnection(); f-#fi7
多用于jsp中 5 p750`n
2、执行sql语句 dW91nTQ:
1)用Statement来执行sql语句 [KJm&\evp
String sql; A%Ao yy4E
Statement sm = cn.createStatement(); NLj0\Pz|B
sm.executeQuery(sql); // 执行数据查询语句(select) edm&,ph]
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); =,sMOJc>
2)用PreparedStatement来执行sql语句 {It4=I)M
String sql; ?x:\RNB/
sql = "insert into user (id,name) values (?,?)"; _)ERi*}x8
PreparedStatement ps = cn.prepareStatement(sql); #3.\}d)
ps.setInt(1,xxx); P5Fm<f8\
ps.setString(2,xxx); V'_^g7}l&
... /dCZoz~~T
ResultSet rs = ps.executeQuery(); // 查询 UOq$88sr
int c = ps.executeUpdate(); // 更新
o]
=
&
`XTu$+
3、处理执行结果 sI`Lsd'V
查询语句,返回记录集ResultSet oo2VT
更新语句,返回数字,表示该更新影响的记录数 ^LZU><{';
ResultSet的方法 "jy'Dpy0m
1、next(),将游标往后移动一行,如果成功返回true;否则返回false atYm.qb
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 +* &!u=%G
Ly3^zFW
4、释放连接 |*!I(wm2i
cn.close(); z\v\T|C
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection FG'1;x!
i~4:]r22
可滚动、更新的记录集 ,cS|fG
1、创建可滚动、更新的Statement .n"aQ@!
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); gB?#T
该Statement取得的ResultSet就是可滚动的 G.9?ApG9
2、创建PreparedStatement时指定参数 @]~\H-8
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); " #JRw
ResultSet.absolute(9000); Pocm.
批量更新 DBOz<|
1、Statement k;"=y)@o
Statement sm = cn.createStatement(); h:l\kr|9
sm.addBatch(sql1); 2;A].5>l
sm.addBatch(sql2); Rj-<tR{
... ]NN9FM.2b/
sm.executeBatch() C8i}~x<
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 FFPO?y$
2、PreparedStatement 5pz%DhjLo
PreparedStatement ps = cn.preparedStatement(sql); RXh/[t+
{ bA1uh]oB
ps.setXXX(1,xxx); \4mw>8wA
... sz_|py?0
ps.addBatch(); `_<K#AG Ai
} C^.:{
ps.executeBatch(); R5qC;_0cV
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 "GgK,d}%
$/6.4"j
事务的处理 3:!+B=woR
1、关闭Connection的自动提交 \6*3&p
cn.setAutoCommit(false); nx=Zl:Q}
2、执行一系列sql语句 u=A&n6Q[Vo
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close MAhcwmZNy
Statement sm ; J-hP4t&x
sm = cn.createStatement(insert into user...); T0v;8Ee
sm.executeUpdate(); u3Ua>A-
sm.close(); #R@{Bu=C
sm = cn.createStatement("insert into corp...); ?%F*{3IP
sm.executeUpdate(); (`xhh
sm.close(); m@)K]0g<f
3、提交 59IxY
?
cn.commit(); J'|qFS
4、如果发生异常,那么回滚 Rm{S,
cn.rollback();