java 数据库基本操作 ps4Wwk(
1、java数据库操作基本流程 LxYM"_1A;
2、几个常用的重要技巧: DdA}A>47
可滚动、更新的记录集 q=L*
99S
批量更新 T[2f6[#[_
事务处理 B3k],k
`qy6qKl
N
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 `'{%szmD
1、取得数据库连接 ,1.([%z+r
1)用DriverManager取数据库连接 L@x8hUG"
例子 js$a^6
String className,url,uid,pwd; &B>uPZ]
className = "oracle.jdbc.driver.OracleDriver"; u{dN>}{
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; R,b O{2O
uid = "system"; pOe` *2[
pwd = "manager"; Eo3Aak o
Class.forName(className); D-\'P31
Connection cn = DriverManager.getConnection(url,uid,pwd); Z[A|SyZp
2)用jndi(java的命名和目录服务)方式 5 <>agK]
例子 gpTF^.(
String jndi = "jdbc/db"; "vHAp55B{
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); W YqL
DataSource ds = (DataSource) ctx.lookup(jndi); M`,Z#)Af
Connection cn = ds.getConnection(); ,,-[P*@
多用于jsp中 #p:jKAc3
2、执行sql语句 1Z{p[\k
1)用Statement来执行sql语句 %emPSBf@
String sql; 4m~stDlN
Statement sm = cn.createStatement(); 2wimP8
sm.executeQuery(sql); // 执行数据查询语句(select) kl<B*:RqH
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); R S_lQ{'
2)用PreparedStatement来执行sql语句 I4DlEX
String sql; H<}Fk9
sql = "insert into user (id,name) values (?,?)"; X9BBnZ
PreparedStatement ps = cn.prepareStatement(sql); U=<.P;+f9
ps.setInt(1,xxx); -W"0,.Dvg
ps.setString(2,xxx); x~Esu}x7
... e, 3(i!47
ResultSet rs = ps.executeQuery(); // 查询 *,=+R$
int c = ps.executeUpdate(); // 更新 ;<ma K*f\S
d+| !6
3、处理执行结果 +!Gr`&w*)
查询语句,返回记录集ResultSet \:)o'-
更新语句,返回数字,表示该更新影响的记录数 >"My\o
ResultSet的方法 !/lYq;$R
1、next(),将游标往后移动一行,如果成功返回true;否则返回false o_^d>Klb8
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 af5`ktx
_=M'KCL*)
4、释放连接 sYW)h$p;D
cn.close(); 4Xho0lO&
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection wjGjVTtHs
HC`3AQ12!&
可滚动、更新的记录集 8QgL7
1、创建可滚动、更新的Statement .2- JV0
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 8@*|T?r
该Statement取得的ResultSet就是可滚动的 9^h%}>
2、创建PreparedStatement时指定参数 VX@G}3Ck
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); qc4"0Ap'
ResultSet.absolute(9000); .L|ax).D
批量更新 *"bp}3$^^
1、Statement Y{:/vOj
Statement sm = cn.createStatement(); [";5s&)q
sm.addBatch(sql1); 7%x+7
sm.addBatch(sql2); "ddH7:(k<
... F!cAaL1
sm.executeBatch() +g7nM7,1a
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 %Yn)t3d
2、PreparedStatement >u[1v
PreparedStatement ps = cn.preparedStatement(sql); |MR?8A^"
{ N5_.m(:
ps.setXXX(1,xxx); wLp
t2b8S
... Tsp-]-)
ps.addBatch(); }EG(!)u
} p5rRhu/|k3
ps.executeBatch(); 4E(5Ccb
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 <R8Z[H:bV
t'/;Z:
事务的处理 _o"3gfH&sJ
1、关闭Connection的自动提交 a~TZ9yg+HL
cn.setAutoCommit(false); DyTk<L
2、执行一系列sql语句 1^>g>bn_"
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ?B!ZqJ#
Statement sm ; nAC#_\
sm = cn.createStatement(insert into user...); T@WMT,J6j
sm.executeUpdate(); D}U<7=\3H
sm.close(); Z|GkM5QH:
sm = cn.createStatement("insert into corp...); Bj[/tQ
sm.executeUpdate(); "{xv|C<*n
sm.close(); dct#ECT
3、提交 w1G.^
cn.commit(); 1@dx(_
4、如果发生异常,那么回滚 lH>XIEj
cn.rollback();