java 数据库基本操作 3F|#nq
1、java数据库操作基本流程 ELqpIXq#
2、几个常用的重要技巧: t+@UC+aW
可滚动、更新的记录集 6;vfl*
批量更新 9_<>#)u5
事务处理 FT+[[9i
k^v P|*eu
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ?^z.WQ|f@
1、取得数据库连接 "0#d F:qt
1)用DriverManager取数据库连接 H:>i:\J/M9
例子 1.y|bB+kB
String className,url,uid,pwd; K`#bLCXEV0
className = "oracle.jdbc.driver.OracleDriver"; N)N\iad^
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; y:+4-1
uid = "system"; f*&4d
pwd = "manager"; y?*4SLy
Class.forName(className); MH=;[ | N
Connection cn = DriverManager.getConnection(url,uid,pwd); Zcg@]Sx(I
2)用jndi(java的命名和目录服务)方式 "~^#{q
例子 -=CZhp
String jndi = "jdbc/db"; O0Sk?uJ<
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); cop \o4ia
DataSource ds = (DataSource) ctx.lookup(jndi); /R%
Xkb
Connection cn = ds.getConnection(); u?+i5=N9{
多用于jsp中 K,Z_lP_~Vw
2、执行sql语句 3T7,Y(<V
1)用Statement来执行sql语句 ;R8pVj!1f
String sql; "g>, X[g
Statement sm = cn.createStatement(); )T26cT$
sm.executeQuery(sql); // 执行数据查询语句(select) y o
|"-
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); sAec*Q(R
2)用PreparedStatement来执行sql语句 XlGDv*d:#d
String sql; haW*W=kv)
sql = "insert into user (id,name) values (?,?)"; eod-N}o
PreparedStatement ps = cn.prepareStatement(sql); 9j~|m
ps.setInt(1,xxx); eQQ*ZNG
ps.setString(2,xxx); !HPye@Ua
... L5-Kw+t
ResultSet rs = ps.executeQuery(); // 查询 F2#s^4Ii
int c = ps.executeUpdate(); // 更新 >;}q
_BP!{~&;
3、处理执行结果 m"y_@Jk
查询语句,返回记录集ResultSet :]g>8sWL
更新语句,返回数字,表示该更新影响的记录数 0k\BE\PQk
ResultSet的方法 1L\\](^
3
1、next(),将游标往后移动一行,如果成功返回true;否则返回false #2\
0#HN
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 @K:TGo,%I
Q5~Y;0'
4、释放连接 C`LHFqv
cn.close(); lZ![?t}2`
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection q"O4}4`
zEYT,l
可滚动、更新的记录集 u~y0H
1、创建可滚动、更新的Statement fce~a\y0
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); "fTW2D74
该Statement取得的ResultSet就是可滚动的 AV%t<fDG#
2、创建PreparedStatement时指定参数 /$NZj"#
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); u^Sa{Jk=
ResultSet.absolute(9000); qe{:9
批量更新 w%L::Z4
1、Statement ./#F,^F2
Statement sm = cn.createStatement(); XFv) ]_G
sm.addBatch(sql1); s}5,<|DL
sm.addBatch(sql2); ub,GF?9
... )ir*\<6Y=
sm.executeBatch() WQ>y;fi5/{
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 c&AJFED]<
2、PreparedStatement ?1kXV n$
PreparedStatement ps = cn.preparedStatement(sql); |MQ_VZ{6
{ 8M&q
ps.setXXX(1,xxx); OPtFz6
... ,KyG^;Riy
ps.addBatch(); :G\X
} >.X& v
ps.executeBatch(); ?\7$63gBH
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 i,z^#b7JQ
$63_*9
事务的处理 aUTXg60l*
1、关闭Connection的自动提交 rMy(NAo_
cn.setAutoCommit(false); zs<2Ozv
2、执行一系列sql语句 /+g9C(['
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ?wpS
Statement sm ; /3`(Ki{
Q
sm = cn.createStatement(insert into user...); 8'}D/4MUr
sm.executeUpdate(); Svun
RUE-f
sm.close(); Ga
M:/.
sm = cn.createStatement("insert into corp...); R@[gkj
sm.executeUpdate(); .Fe_Z)i>h
sm.close(); [W#M(`}D
3、提交 3{*nG'@Mal
cn.commit(); 2:4:Q[{A
4、如果发生异常,那么回滚 JsZLBq*lP
cn.rollback();