java 数据库基本操作 ]G&[P8hzB
1、java数据库操作基本流程 b+Sj\3fX
2、几个常用的重要技巧: ^G qO>1U
可滚动、更新的记录集 xqdkc^b
批量更新 ?Kmz urG
事务处理 NI/'SMj%
@Y,t]
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 %#fjtbeB
1、取得数据库连接 ;+DMv5A "
1)用DriverManager取数据库连接 u;%~P 9O
例子 0rX%z$D+@
String className,url,uid,pwd; ;7[DFlS\P
className = "oracle.jdbc.driver.OracleDriver"; .`*;AT
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; `C7pM
uid = "system";
wBlE!Pm
pwd = "manager"; t.&JPTK-H
Class.forName(className); <=!t!_
Connection cn = DriverManager.getConnection(url,uid,pwd); o^5UHFxTCB
2)用jndi(java的命名和目录服务)方式 g[y&GCKY!=
例子 lhQMR(w^
String jndi = "jdbc/db"; Nnn~7
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ,nog6\
DataSource ds = (DataSource) ctx.lookup(jndi); 5k=04=Iyh#
Connection cn = ds.getConnection(); G(A7=8vW
多用于jsp中 -~sW@u)O
2、执行sql语句 f*V^HfiQb
1)用Statement来执行sql语句 p%Q{Rqc)
String sql; e`B!)Sr
Statement sm = cn.createStatement(); zp4@T)
sm.executeQuery(sql); // 执行数据查询语句(select) ;B<rw^h5
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); -5os0G80
2)用PreparedStatement来执行sql语句 Ur[ai6LNG
String sql; (^T}6t3+4
sql = "insert into user (id,name) values (?,?)"; ZCK#=:ln
PreparedStatement ps = cn.prepareStatement(sql); ^-Ks_4
ps.setInt(1,xxx); AN,3[Sh
ps.setString(2,xxx); s!W{ru
... {y|.y~vW
ResultSet rs = ps.executeQuery(); // 查询 o7gZc/?n
int c = ps.executeUpdate(); // 更新 .$f0!`
t
8\)4waz$
3、处理执行结果 3Zz_wr6
查询语句,返回记录集ResultSet sw$JY}Q8x
更新语句,返回数字,表示该更新影响的记录数 MB5V$toC
ResultSet的方法 >!PM5%G
1、next(),将游标往后移动一行,如果成功返回true;否则返回false mE+=H]`.p
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 PMiu "
?mi}S${g
4、释放连接 $v8T%'p+
cn.close(); 3]NKAPY
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 1)e[F#|
lq1223
可滚动、更新的记录集 V1i^#;
1、创建可滚动、更新的Statement #cikpHLXG
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); "<L9-vb
该Statement取得的ResultSet就是可滚动的 gjJ:s,Fg
2、创建PreparedStatement时指定参数 W;X:U.
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); EnMc9FN(y
ResultSet.absolute(9000); 1JS5 LS
批量更新 6DEH|2
1、Statement cri-u E?
Statement sm = cn.createStatement(); 4X:mb}(
sm.addBatch(sql1); YYe<StyH
sm.addBatch(sql2); AgDXpaq
... !~mPxGY
sm.executeBatch() (e
2.Ru
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 rXrIGgeM
2、PreparedStatement .dc|?$XV
PreparedStatement ps = cn.preparedStatement(sql); hZ>1n&[@
{ ju.`c->k"
ps.setXXX(1,xxx); x {Rj2~KC
... ? _[q{i{
ps.addBatch(); H_iQR9Ak7
} ?U:c\TA,m
ps.executeBatch(); HS.eK#:N
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Pr/q?qZY
*P12d
事务的处理 rv~OfL
1、关闭Connection的自动提交 I'J-)D`
cn.setAutoCommit(false); UHI<8o9
2、执行一系列sql语句 /Zz[vf
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close }Zp[f6^Q
Statement sm ; meD83,L~N
sm = cn.createStatement(insert into user...); kCZ'p
sm.executeUpdate(); Fe2iG-ec
sm.close(); 8P%Jky&(
sm = cn.createStatement("insert into corp...); EBmkKiI;
sm.executeUpdate(); ?;rRR48T9E
sm.close(); 9:!V":8q
3、提交 >(gbUW
cn.commit(); B.?@VF
4、如果发生异常,那么回滚 4E$6&,\
cn.rollback();