java 数据库基本操作 ky
8e p
1、java数据库操作基本流程 2fU$J>Y
2、几个常用的重要技巧: "fg](Cp[z
可滚动、更新的记录集 cJM:
批量更新 <APB11
事务处理 mrm^e9*Z
>FhK#*Pa
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 )
\Y7&
1、取得数据库连接 i>EgG5iJ
1)用DriverManager取数据库连接 7NC=*A~
例子 1h*)@
String className,url,uid,pwd; 9ukg }_Hx
className = "oracle.jdbc.driver.OracleDriver"; D+~_TA
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; s[8@*/ds
uid = "system"; ^8 ' sib
pwd = "manager"; J--m[X
Class.forName(className); *A}cL
Connection cn = DriverManager.getConnection(url,uid,pwd); yCJ Fo
2)用jndi(java的命名和目录服务)方式 ^:9$@+a
例子 0Io'bF
String jndi = "jdbc/db"; .nYUL>
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); #jAqra._b
DataSource ds = (DataSource) ctx.lookup(jndi); UgWs{y2SE.
Connection cn = ds.getConnection(); nR4y`oP+
多用于jsp中 :{NC-%4o0
2、执行sql语句 f84:hXo6
1)用Statement来执行sql语句 ,uzN4_7u
String sql; *. 3N=EO
Statement sm = cn.createStatement(); fzjU<?}
sm.executeQuery(sql); // 执行数据查询语句(select) |
ohL]7b<
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); T&86A\D\z
2)用PreparedStatement来执行sql语句 "x@='>:$
String sql; p8s:g~ W
sql = "insert into user (id,name) values (?,?)"; "<}&GcJbz
PreparedStatement ps = cn.prepareStatement(sql); J 5h+s-'
ps.setInt(1,xxx); &V|>dLT>A
ps.setString(2,xxx); 5Z4-Z
... |QV!-LK
ResultSet rs = ps.executeQuery(); // 查询 jjJ2>3avY
int c = ps.executeUpdate(); // 更新 qQ!1t>j+H
Soie^$
Y
3、处理执行结果 {0! ~C=P
查询语句,返回记录集ResultSet bYz&P`o}
更新语句,返回数字,表示该更新影响的记录数 =AVgIv
ResultSet的方法 ~&\ f|%
1、next(),将游标往后移动一行,如果成功返回true;否则返回false a[lY S{
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 R<i38/ ~G
8Ld:"Y#
4、释放连接 D>Gt]s
cn.close(); !v]b(z`Y
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection %{6LUn
OMwsbp&
可滚动、更新的记录集 A:<;M@q!
1、创建可滚动、更新的Statement X=8Y%
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); zI~owK)%Z
该Statement取得的ResultSet就是可滚动的 !_2n
2、创建PreparedStatement时指定参数 `OymAyEYQ
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); nC {K$
ResultSet.absolute(9000); g*w<*
批量更新 ~2EH OO{
1、Statement e!fqXVEVR
Statement sm = cn.createStatement(); 65ly2gl
sm.addBatch(sql1); fC}R4f7C
sm.addBatch(sql2); L6>pGx
... ,G#.BLH
cX
sm.executeBatch() g'];Estb~
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 9 2MTX
Osp
2、PreparedStatement '8Phxx|
PreparedStatement ps = cn.preparedStatement(sql); |*RYq2y
{ T5Dw0Y6u,
ps.setXXX(1,xxx); ,ZblIOWb
... jL)WPq!m+
ps.addBatch(); KJE[+R H+z
} 4@.|_zY
ps.executeBatch(); %3HVFhl
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 iTW? W\d
Bx[rC
事务的处理 %AOIKK5
1、关闭Connection的自动提交 8G>>i)Sbg
cn.setAutoCommit(false); vpPl$ga5bY
2、执行一系列sql语句 V|)>{Xdn
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close VL9-NfeqR
Statement sm ; Y^%T}yTtq
sm = cn.createStatement(insert into user...); Wlh~)
sm.executeUpdate(); B*htN
sm.close(); R(j1n,c]
sm = cn.createStatement("insert into corp...); D@EO=08<b
sm.executeUpdate(); ,Ma.V\T[
sm.close(); Y32O-I!9u
3、提交 4/X/>Y1
cn.commit(); ^$%Z!uz
4、如果发生异常,那么回滚 )Qm[[p nj
cn.rollback();