java 数据库基本操作 }(k#,&Fv`
1、java数据库操作基本流程 Yv<'QC
2、几个常用的重要技巧: +Z> Y//
可滚动、更新的记录集 =r"-Pm{
批量更新 &|yQwNA*a"
事务处理 *j5>2-C &
%:2EoXN"
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 jBZlNEw
1、取得数据库连接 QZ?# ixvJ
1)用DriverManager取数据库连接 ;wo
例子 POvxZU
String className,url,uid,pwd; 8=QOp[w
className = "oracle.jdbc.driver.OracleDriver"; c%y(Z5
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; vT/e&8w
uid = "system"; 2-!OflkoM0
pwd = "manager"; Z/-9G
Class.forName(className); mApn[)?tv
Connection cn = DriverManager.getConnection(url,uid,pwd); R=&9M4
2)用jndi(java的命名和目录服务)方式 p7et>;WRx
例子 =1Nz*
c
String jndi = "jdbc/db"; aF*KY<w
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); s B!#`kh
DataSource ds = (DataSource) ctx.lookup(jndi); ?YE'J~0A6
Connection cn = ds.getConnection(); -#<6
多用于jsp中 W>f q 9
2、执行sql语句 \9"
1)用Statement来执行sql语句 KuBN_bd
String sql; 4'3do>!
Statement sm = cn.createStatement(); 21NGsG
sm.executeQuery(sql); // 执行数据查询语句(select) paKur%2u
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 0RHKzk6~c
2)用PreparedStatement来执行sql语句 ` 9;0Y
String sql; LLy w9y1
sql = "insert into user (id,name) values (?,?)"; %+ln_lgD:
PreparedStatement ps = cn.prepareStatement(sql); ot\ FZ
ps.setInt(1,xxx); ;f;A"
ps.setString(2,xxx); q4u,pm,@
... m=Mb'<
ResultSet rs = ps.executeQuery(); // 查询 (V&5EO8)
int c = ps.executeUpdate(); // 更新 o>|&k]W/
g)?Ol
3、处理执行结果 b a5,?FVI~
查询语句,返回记录集ResultSet o\/&05rp]
更新语句,返回数字,表示该更新影响的记录数
NOY`1i
ResultSet的方法 k=]#)A(#C
1、next(),将游标往后移动一行,如果成功返回true;否则返回false -M]B;[^
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 $Lj~ge3#
~6{iQZa1Y
4、释放连接 Fl0(n #L
cn.close(); ?'_Ty`vT
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Cws;6i*=@
s!k7Wwj
可滚动、更新的记录集 G5WQTMzf&
1、创建可滚动、更新的Statement d]A.=NAc
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); F}1h
该Statement取得的ResultSet就是可滚动的 0gRj3al(
2、创建PreparedStatement时指定参数 NS<C"O
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); :1*q}R
ResultSet.absolute(9000); vEy0DHEE
批量更新 sNaLz
1、Statement ^aG$9N<\
Statement sm = cn.createStatement(); TWzlF>4N
sm.addBatch(sql1); mM9a T0_w
sm.addBatch(sql2); [^Z)f<l
... 2[!3!@.
sm.executeBatch() u+/Uc:XK)
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 {c
:7:
2、PreparedStatement 6a*?m{
PreparedStatement ps = cn.preparedStatement(sql); J\@|c.ws
{ [}Q_T.4)E
ps.setXXX(1,xxx); p9>{X\eT:
... ^fiJxU
ps.addBatch(); GLO%>&
} }VU^ 8D
ps.executeBatch(); C/$bgK[ev
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 s5bqS'%
3_ bE12
事务的处理 ZLjEH7
1、关闭Connection的自动提交 SFu]*II;{
cn.setAutoCommit(false); FR9w0{o
2、执行一系列sql语句
HNJR&U t
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close gmUXh;aHc
Statement sm ; A%[e<vj9
sm = cn.createStatement(insert into user...); reQr=OAez
sm.executeUpdate(); -F. c<@*E
sm.close(); J&2J6Eq
sm = cn.createStatement("insert into corp...); \gsJ1@
sm.executeUpdate(); bO i-QD
sm.close(); 6i+<0b}!/
3、提交 ~dO+kD
cn.commit(); F50l->F2&
4、如果发生异常,那么回滚 vp32}zeD
cn.rollback();