java 数据库基本操作 iz{TSU
1、java数据库操作基本流程 V|[NL4
2、几个常用的重要技巧: +|7N89l
可滚动、更新的记录集 +!!G0Zj/
批量更新 K+XUC
事务处理 %>6ilGQ+
e-[PuJ
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 SynRi/BRmw
1、取得数据库连接 qxsHhyB_n;
1)用DriverManager取数据库连接 BW}M/
例子 }p?67y/
String className,url,uid,pwd; |lg jI!iK
className = "oracle.jdbc.driver.OracleDriver"; <;O^3_'
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; (DS"*4ty
uid = "system"; SbzJeaZv
pwd = "manager"; o4J@M{xb_
Class.forName(className); g_N^Y
Connection cn = DriverManager.getConnection(url,uid,pwd); 0:<Y@#L
2)用jndi(java的命名和目录服务)方式 +."cbqGP_q
例子 k_ywwkG9lU
String jndi = "jdbc/db"; :K"~PrHm
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ~fb#/%SV
DataSource ds = (DataSource) ctx.lookup(jndi); ZoSyc--Bv
Connection cn = ds.getConnection(); 8DY:a['-d
多用于jsp中 pek=!nZ
2、执行sql语句 4d}=g]P
1)用Statement来执行sql语句 !c1M{klP
String sql; ".waCt6
Statement sm = cn.createStatement(); ?6{g7S%
sm.executeQuery(sql); // 执行数据查询语句(select) kS=nH9
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); dUt4]
ar
2)用PreparedStatement来执行sql语句 ]!@=2kG4
String sql; RA[%8Rh)
sql = "insert into user (id,name) values (?,?)"; 12m-$/5n+
PreparedStatement ps = cn.prepareStatement(sql); X!mJUDzh]
ps.setInt(1,xxx); u[Si=)`VPk
ps.setString(2,xxx); `JpFqZ'58
... ~zG)<S"q
ResultSet rs = ps.executeQuery(); // 查询 hayJgkZ'
int c = ps.executeUpdate(); // 更新 }!R*Q`m
-2 >s#/%
3、处理执行结果 !{+.)%d'g
查询语句,返回记录集ResultSet '`.-75T
更新语句,返回数字,表示该更新影响的记录数 v9Sk\9}S
ResultSet的方法 hliO/3g
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ViMl{3
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ;1{=t!z=
#;W4$q
4、释放连接 ]'M B3@T
cn.close(); 80'@+AD
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection +,AzxP
_y
xkiiQs)
可滚动、更新的记录集 :vzIc3~c:`
1、创建可滚动、更新的Statement $u'"C|>8
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ;UM(y@
该Statement取得的ResultSet就是可滚动的 S50}]5K
2、创建PreparedStatement时指定参数 VltM{-k^
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); mH0OW
ResultSet.absolute(9000); W=w]`'
批量更新 saQs<1
1、Statement VHMQY*lk
Statement sm = cn.createStatement(); 0Xw>_#Y/xS
sm.addBatch(sql1); 1[u{y{9 q
sm.addBatch(sql2); C.ji]P#
... H!u8+
sm.executeBatch() [fV"tf;
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Mj6,VD9L
2、PreparedStatement !4=_l6kg~+
PreparedStatement ps = cn.preparedStatement(sql); ^v'0\(H?P
{ G.~Q2O#T
ps.setXXX(1,xxx); {wj%WSQj/y
... L6fbR-&Lt
ps.addBatch(); /|i*'6*
} fCF.P"{W"
ps.executeBatch(); X&LJ"ahK
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 v[{7\Hha
-3v\ c~
事务的处理 5N%d Les
1、关闭Connection的自动提交 K:$mEB[c<
cn.setAutoCommit(false); 6Aq]I$
2、执行一系列sql语句 !rAH@y.l
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close [+pa,^
Statement sm ; 'TH[Db'`I
sm = cn.createStatement(insert into user...); o:W*#dt
sm.executeUpdate(); Qg~w 3~
sm.close(); e98QT9
sm = cn.createStatement("insert into corp...); Y6H?ZOq
sm.executeUpdate(); D"$Y, d
sm.close(); &*ocr &
3、提交 _cWuRvY
cn.commit(); -Yh(bS
l
4、如果发生异常,那么回滚 ,f>9oOqqA
cn.rollback();