java 数据库基本操作 F @PPhzZ
1、java数据库操作基本流程 QK-aH1r
2、几个常用的重要技巧: H,7='n7"
可滚动、更新的记录集 "#d$$ 8
批量更新 3lUVDNbZ
事务处理 Vk6c^/v
Etz#+R&*
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 V6g*"e/8
1、取得数据库连接 T^A(v(^D
1)用DriverManager取数据库连接 *lfjsrPu
例子 S^QEc tXU
String className,url,uid,pwd; q\fbrv%I4
className = "oracle.jdbc.driver.OracleDriver"; !sT>]e
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr;
NFT:$>83`
uid = "system"; )UR$VL
pwd = "manager"; VUP|j/qD
Class.forName(className); mb\T)rj
Connection cn = DriverManager.getConnection(url,uid,pwd); Rk$7jZdTf
2)用jndi(java的命名和目录服务)方式
|~9rak,
例子 M
Kyj<@[
String jndi = "jdbc/db"; \8{SQ%
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); lu#a.41
DataSource ds = (DataSource) ctx.lookup(jndi); zEQ]5>mG
Connection cn = ds.getConnection(); ?^&ih:"
多用于jsp中 M\1CDU+*Ns
2、执行sql语句 -laH^<jm5
1)用Statement来执行sql语句 HhbBt'fH
String sql; $(1t~u<17
Statement sm = cn.createStatement(); {v"f){
sm.executeQuery(sql); // 执行数据查询语句(select) mR0`wrt
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); (j8*F Bq
2)用PreparedStatement来执行sql语句 @-q,%)?0}=
String sql; zteu{0
sql = "insert into user (id,name) values (?,?)"; ]3,'U(!+
PreparedStatement ps = cn.prepareStatement(sql); d6i}xnmC
ps.setInt(1,xxx); EjPR+m
ps.setString(2,xxx); ][
$UN
... S>lP?2J
ResultSet rs = ps.executeQuery(); // 查询 *l7 `C)
int c = ps.executeUpdate(); // 更新 P]+B}))
X@~/.H5
3、处理执行结果 pSx5ume95"
查询语句,返回记录集ResultSet 6#=Iv X4
更新语句,返回数字,表示该更新影响的记录数 "im5Fnu
ResultSet的方法
exWQ~&
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 1j2U,_-
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值
S'x ]c#
rJ/HIda
4、释放连接 o$@/@r
cn.close(); `I7s|9-=
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection a~KtH;7<
IADSWzQ@
可滚动、更新的记录集 B>u`%Ry&
1、创建可滚动、更新的Statement 8@3=SO
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); >?+Rtg|${
该Statement取得的ResultSet就是可滚动的 i4YskhT
2、创建PreparedStatement时指定参数 h7]+#U]mi
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 49"C'n0wST
ResultSet.absolute(9000); ~}OaX+!
批量更新 W6?=9].gc
1、Statement |gkNhxzB
Statement sm = cn.createStatement(); <:-4GJH=
sm.addBatch(sql1); zC*FeqFL<
sm.addBatch(sql2); 7FwtBO
... ".jO2GO^
sm.executeBatch() `0upm%A
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 WsTIdr36x
2、PreparedStatement O_ #++G
PreparedStatement ps = cn.preparedStatement(sql); v&:[?<6-
{ 'DW|a
ps.setXXX(1,xxx); g}~s"Sz
... bK "I9T #
ps.addBatch(); DY`0 `T
} 3]S*p ErY
ps.executeBatch(); :$I"n\
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 \O*ZW7?TJ
F2YBkwI
事务的处理 uGAQt9$>_
1、关闭Connection的自动提交 Rk9n,"xpv
cn.setAutoCommit(false); tGOJ4 =
2、执行一系列sql语句 aG1Fj[,
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close q}i#XQU
Statement sm ; V@0T&#
sm = cn.createStatement(insert into user...); yBK$2to~
sm.executeUpdate(); WrP+n
sm.close(); w&@tP^`
sm = cn.createStatement("insert into corp...); hw"2'{"II
sm.executeUpdate(); c@>ztQU*
sm.close(); LR&MhG7
3、提交 i,^-9
cn.commit(); Xau%v5r
4、如果发生异常,那么回滚 o?]Q&,tO
cn.rollback();