java 数据库基本操作 6Oy:5Ps8a
1、java数据库操作基本流程 %(eQ1ir +
2、几个常用的重要技巧: X|hYZR
可滚动、更新的记录集 LQPQ !):;
批量更新 R'c dEoy
事务处理 M+
%O-B
(rBsh6@)
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 :V+rC]0
1、取得数据库连接 }/1^Lqfnz
1)用DriverManager取数据库连接 GE!nf6>Km
例子 ]ouoRlb/
String className,url,uid,pwd; u$a K19K/
className = "oracle.jdbc.driver.OracleDriver"; La1:WYt
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; -6- sI
uid = "system"; '69)m~B0a
pwd = "manager"; W$hCI)m(
Class.forName(className); *P*~CHx>
Connection cn = DriverManager.getConnection(url,uid,pwd); :[n~(~7?
2)用jndi(java的命名和目录服务)方式 ,nteIR'??
例子 u?72]?SM
String jndi = "jdbc/db"; K _VIk'RB
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ^R@)CIQ
DataSource ds = (DataSource) ctx.lookup(jndi); 5 [~HL_u;,
Connection cn = ds.getConnection(); (]'wQ4iQ
多用于jsp中 tB>!1}v
2、执行sql语句 z]8Mv(eL
1)用Statement来执行sql语句 s|<n7 =J
String sql; Q;3`T7
Statement sm = cn.createStatement(); fW2NYQP$:
sm.executeQuery(sql); // 执行数据查询语句(select) > "F-1{
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ]gPx%c
2)用PreparedStatement来执行sql语句 -&2Z/qM&!
String sql; #1J,!seJ
sql = "insert into user (id,name) values (?,?)"; wL),/i&<
PreparedStatement ps = cn.prepareStatement(sql); n zaDO-2!
ps.setInt(1,xxx); #VX]trh,
ps.setString(2,xxx); wd*B3
... jV*10kM<
ResultSet rs = ps.executeQuery(); // 查询 [IOI&`?D
int c = ps.executeUpdate(); // 更新 y{mt *VA4
e x Z/
3、处理执行结果 GqCBD-@4v.
查询语句,返回记录集ResultSet tjtvO@?1-
更新语句,返回数字,表示该更新影响的记录数 d {U%q
d
ResultSet的方法 ZXQ5fBx
1、next(),将游标往后移动一行,如果成功返回true;否则返回false |"LHo
H
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 fU$Jh/#":
P
I"KY@>H
4、释放连接 ZUHW*U.
cn.close(); @~hy'6/
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 9]=J+ (M
jq)Bj#'7
可滚动、更新的记录集 o
i'iZX
1、创建可滚动、更新的Statement ),N,!15j,
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); %W D^0U|
该Statement取得的ResultSet就是可滚动的 Gn
9oInY1
2、创建PreparedStatement时指定参数 eWv:wNouk
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); QoxYzln
ResultSet.absolute(9000); Wd;t(5Xl
批量更新 h623)C;
1、Statement G$Mf(S'f
Statement sm = cn.createStatement(); (k!7`<k!Y
sm.addBatch(sql1); tdRvg7v,N%
sm.addBatch(sql2); L3I$ K+c
... F*U(Wl=
sm.executeBatch() }b54O\,
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 OlyW/hd
2、PreparedStatement ~F-knEvL
PreparedStatement ps = cn.preparedStatement(sql); F?2UHcs
{ 0a:oC(Ak
ps.setXXX(1,xxx); &l2xh~L
... ?X|q
ps.addBatch(); {ax]t-ZwJ5
} r*b+kSh
ps.executeBatch(); 9RlJf=Z#H
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 afX|R
((]i}s0S
事务的处理 [(*Eg!?W=
1、关闭Connection的自动提交 Y(6evo&IR
cn.setAutoCommit(false); E}9wzPs
2、执行一系列sql语句 feyc
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close o
A2oX
Statement sm ; )e0kr46
sm = cn.createStatement(insert into user...); k vZ w4Pk
sm.executeUpdate(); >U*p[ FGW
sm.close(); 5;KJ0N*-
sm = cn.createStatement("insert into corp...); -51LF=(!L
sm.executeUpdate(); 5T.U=_ag
sm.close(); $>#0RzU
3、提交 u4FD}nV
cn.commit(); 6ZE`'pk<
4、如果发生异常,那么回滚 =At" Q6-O
cn.rollback();