java 数据库基本操作 u85y;AE,(
1、java数据库操作基本流程 9HTb
2、几个常用的重要技巧: xmiF!R
可滚动、更新的记录集 R63"j\0
批量更新 D<xP x
事务处理 z[t$[Qg
I*lq0&
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 c"O\fX
1、取得数据库连接 7ZZSAI
1)用DriverManager取数据库连接 0A 4(RLGg
例子 SF.,sCk
String className,url,uid,pwd; _|A)ueY
className = "oracle.jdbc.driver.OracleDriver"; ).tZMLM/-
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; <[~x]-
uid = "system"; 8l='H l
pwd = "manager"; :eIBK
Class.forName(className); gVG :z_6
Connection cn = DriverManager.getConnection(url,uid,pwd); 9MHb<~F
2)用jndi(java的命名和目录服务)方式 Ro-Mex2
例子 G uDus2#+
String jndi = "jdbc/db"; K]
Eq"3
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); d9Q%GG0]
DataSource ds = (DataSource) ctx.lookup(jndi); 8<]> q
Connection cn = ds.getConnection(); *f4KmiQ~%
多用于jsp中 tY[y? DJ
2、执行sql语句 qbP[ 9
1)用Statement来执行sql语句 ~(%G;fZ?x
String sql; bM-Y4[
Statement sm = cn.createStatement(); e9%6+9Y
sm.executeQuery(sql); // 执行数据查询语句(select) |Cen5s
W&
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ,/d-o;W
2)用PreparedStatement来执行sql语句 Z&.FJZUP
String sql; CiMy_`H
sql = "insert into user (id,name) values (?,?)"; nmSpNkJ5
PreparedStatement ps = cn.prepareStatement(sql); ?L'k2J
ps.setInt(1,xxx); {Ua5bSbh
ps.setString(2,xxx); RsV<*s
... n:#ji|wM
ResultSet rs = ps.executeQuery(); // 查询 Xp{gh@#dr
int c = ps.executeUpdate(); // 更新 JGO>X|T
@{nT4{
3、处理执行结果 Vm6^'1CY
查询语句,返回记录集ResultSet
u*9C(je
更新语句,返回数字,表示该更新影响的记录数 MiSFT5$v6
ResultSet的方法 Ab(bvS8r$
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Cog:6Gnw
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 c3
wu&*p{
+m+HC(Z
4、释放连接 W:) M}}&H
cn.close(); [{ zekF~)@
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection +6;OB@
-_4! id
可滚动、更新的记录集 aoJ&< vl3
1、创建可滚动、更新的Statement {;-$;\D
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); gf3/ kll9
该Statement取得的ResultSet就是可滚动的 8wy"m=>=b}
2、创建PreparedStatement时指定参数 1:&$0jU&U
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); u5,IH2BU
ResultSet.absolute(9000); =Wjm_Rvk9
批量更新 PkVXn
1、Statement }F3Z~
Statement sm = cn.createStatement(); :JN3@NsK
sm.addBatch(sql1); ~z
aV.3#
sm.addBatch(sql2); ~P/G^cV3s
... Yb6\+}th
sm.executeBatch() 6C3y+@9
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 #|e<l1 F
2、PreparedStatement WYh7Y
PreparedStatement ps = cn.preparedStatement(sql); 5o72X k
{ >)5vsqGZaK
ps.setXXX(1,xxx); sV*Q8b*
... 3;M!]9ms
ps.addBatch(); I+<; Dsp
} =k8A7P
ps.executeBatch(); +L49
pv5
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ~}M{[6!
keWgbj
事务的处理 d@l;dos),
1、关闭Connection的自动提交 CjST*(,b
cn.setAutoCommit(false); J`V6zGgW
2、执行一系列sql语句 z[k2&=c
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close DMf9wB
Statement sm ; P;y/`_jo
sm = cn.createStatement(insert into user...); xp&I~YPH
sm.executeUpdate(); 9rid98~d
sm.close(); q OXL(
sm = cn.createStatement("insert into corp...); m0#hG
x
sm.executeUpdate(); w%ip"GT,
sm.close(); ^Gyl:hN
3、提交 %kUJ:lg;d
cn.commit(); !*cf}<Kmw
4、如果发生异常,那么回滚 },"g*
cn.rollback();