java 数据库基本操作 ^%~ztn 51
1、java数据库操作基本流程 |2CW!is
2、几个常用的重要技巧: (6A>:_)
可滚动、更新的记录集 twz
批量更新 9<kKno
事务处理 )PL'^gRr
,
M /-lW
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 T~s/@*y9
1、取得数据库连接 _bqiS]:
1)用DriverManager取数据库连接 -))>7skc
例子 _t6siB_u
String className,url,uid,pwd; THJ KuWy
className = "oracle.jdbc.driver.OracleDriver"; cx|[P6d
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; TSdjX]Kf
uid = "system"; DX}EOxO,.
pwd = "manager"; w4'(Y,(`
Class.forName(className); "sz LTC]*6
Connection cn = DriverManager.getConnection(url,uid,pwd); Yk(OVl T
2)用jndi(java的命名和目录服务)方式 Xx:0Nt]
例子 >r{3t{
String jndi = "jdbc/db"; d%1S6eYa'
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); G(JvAe]r
DataSource ds = (DataSource) ctx.lookup(jndi); Q}^
n
Connection cn = ds.getConnection(); u9:;ft{}N
多用于jsp中 H|0B*i@81
2、执行sql语句 JnhHV(H
1)用Statement来执行sql语句 o%h\55 S
String sql; lk \|EG
Statement sm = cn.createStatement(); 6ecr]=Cv
sm.executeQuery(sql); // 执行数据查询语句(select) KZ ?<&x
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 1KruGq~
2)用PreparedStatement来执行sql语句 -2v|d]3qG
String sql; ^wb -s
sql = "insert into user (id,name) values (?,?)"; dS0G+3J&+E
PreparedStatement ps = cn.prepareStatement(sql); \>cZ=
ps.setInt(1,xxx); wz.Il-sm
ps.setString(2,xxx); ]O<Yr'
... ]SBv3Q0D7
ResultSet rs = ps.executeQuery(); // 查询 TnL%_!V!
int c = ps.executeUpdate(); // 更新 MgHyKn'rL
miuJ!Kr'
3、处理执行结果 ]j*o&6cQf
查询语句,返回记录集ResultSet zVxiCyU
更新语句,返回数字,表示该更新影响的记录数 X^_,`H@
ResultSet的方法 1k2Ck
1、next(),将游标往后移动一行,如果成功返回true;否则返回false vH#
US
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Br]VCp
g]$>G0E`oD
4、释放连接 5Ag]1k{
cn.close(); $msT,$NJ
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection da\K>An>
s?~Abj_
可滚动、更新的记录集 dT/Cn v=
1、创建可滚动、更新的Statement uz>s2I}B
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); m{pL<
g^M
该Statement取得的ResultSet就是可滚动的 (oq(-Wv
2、创建PreparedStatement时指定参数 @WhcY*R2
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); akm) X0!-}
ResultSet.absolute(9000); &lBfW$PZjk
批量更新 |xQj2?_z*
1、Statement
TnM}|~V
Statement sm = cn.createStatement(); +/\.%S/
sm.addBatch(sql1); 5tP0dQYd
sm.addBatch(sql2); `U2PlCf|
... /nb(F h|{T
sm.executeBatch() 3(^9K2.s}
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 lxbbyy25
2、PreparedStatement PwF}yxkI
PreparedStatement ps = cn.preparedStatement(sql); x18ei@c
{ b44H2A.
ps.setXXX(1,xxx); cJ!wZT`
... 70HEu@-
ps.addBatch(); }xLwv=Ia
} 8k_,Hni
ps.executeBatch(); SwC,=S
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 umrRlF4M;
<6dD{{J]>p
事务的处理 e6sL N
1、关闭Connection的自动提交 Mk@ _uPm
cn.setAutoCommit(false); CG=#rc]vz
2、执行一系列sql语句 ><\mt
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ]P(Eo|)m
Statement sm ; .vG6\U7
sm = cn.createStatement(insert into user...); vm8QKPy
sm.executeUpdate(); l,6="5t
sm.close(); hH"3Y}U@
sm = cn.createStatement("insert into corp...); )/
s9ty
sm.executeUpdate(); r+m8#uR
sm.close(); q n =6>wP
3、提交 VrF]X#\)
cn.commit();
`Yoafa
4、如果发生异常,那么回滚 bnD>/z]E
cn.rollback();