java 数据库基本操作 ,IPryI
1、java数据库操作基本流程 ;It1i`!R
2、几个常用的重要技巧: `pXPF}T
可滚动、更新的记录集 JD~]aoH
批量更新 KkSv23In
事务处理 h`D+NZtWm
d z\yP
v~
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Np?/r}
1、取得数据库连接 #U6~U6@
1)用DriverManager取数据库连接 ,o\~d?4
例子 W"g@*B'|
String className,url,uid,pwd; 'kekJ.wJ;
className = "oracle.jdbc.driver.OracleDriver"; wx^1lC2
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Sr-!-eC
uid = "system"; T9AFL;1
pwd = "manager"; 8ZNwo
Class.forName(className); X1="1{8H
Connection cn = DriverManager.getConnection(url,uid,pwd); KS;Wr6]@(O
2)用jndi(java的命名和目录服务)方式 gFxa UrZA
例子 4EJ6Zy![0*
String jndi = "jdbc/db"; 5Y5N
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Zb2.o5#}
DataSource ds = (DataSource) ctx.lookup(jndi); "9,+m$nj
Connection cn = ds.getConnection(); =BBqK=W.d
多用于jsp中 }^PdW3O*m,
2、执行sql语句 2*Mu"v,
1)用Statement来执行sql语句
e9eBD
String sql; ;h4w<OqcM
Statement sm = cn.createStatement(); | EFbT>
sm.executeQuery(sql); // 执行数据查询语句(select) 8'0KHn{#
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); G}`Hu_ [\)
2)用PreparedStatement来执行sql语句 Ekz)Nh)vGR
String sql; k&o1z'<C
sql = "insert into user (id,name) values (?,?)"; gP=@u.
PreparedStatement ps = cn.prepareStatement(sql); G:;(,
ps.setInt(1,xxx); IJ6&*t
wT
ps.setString(2,xxx); t8B==%
... %M-B"#OB7
ResultSet rs = ps.executeQuery(); // 查询 ys9MV%*
int c = ps.executeUpdate(); // 更新 Es+BV+x[.c
M!iYj+nrP
3、处理执行结果 (ChL$!x
查询语句,返回记录集ResultSet r%II`
i
更新语句,返回数字,表示该更新影响的记录数 CQ#%v%
ResultSet的方法 5x}OrfDU
1、next(),将游标往后移动一行,如果成功返回true;否则返回false vH vwH
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Nk shJ2
%|3NCyJ*7
4、释放连接 z.*=3
cn.close(); ETq~,g'
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection -42jeJS
?N@p~
*x
可滚动、更新的记录集 !Baq4V?KN
1、创建可滚动、更新的Statement ysQ8==`38i
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); CfjVx
该Statement取得的ResultSet就是可滚动的 ~[
x}
2、创建PreparedStatement时指定参数 !S[7IBk%
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); sme!!+Rd
ResultSet.absolute(9000); G
4C 7
批量更新 i)+2?<]
1、Statement +FYhDB~m
Statement sm = cn.createStatement(); QfsTUAfR
sm.addBatch(sql1); e[J0+
x#;r
sm.addBatch(sql2); 8}Su7v1
... ZTP&*+d
sm.executeBatch() 8(0q,7)y
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 G1:2MPH
2、PreparedStatement Qrt> vOUE7
PreparedStatement ps = cn.preparedStatement(sql); wvNddu>@
{ ceGo:Aa<)
ps.setXXX(1,xxx); JS!
... I)F3sS45}
ps.addBatch(); #zc{N"!
} j?P8&Fm<
ps.executeBatch(); D[R<H((
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 xnG,1doa
3}X; WE `
事务的处理 w7X], auRC
1、关闭Connection的自动提交 +#R<emW
cn.setAutoCommit(false); NQhlb"Ix
2、执行一系列sql语句 ~<w9a]
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close j%OnLTZ
Statement sm ; lBnG!!VrWa
sm = cn.createStatement(insert into user...); N}j^55M_]
sm.executeUpdate(); `Hq)g1a7q
sm.close(); }mSfg
sm = cn.createStatement("insert into corp...); 3QzHQU
sm.executeUpdate(); =o+))R4
sm.close(); 6z80Y*|eJ
3、提交 3re|=_
Hy
cn.commit(); kQMALS@R
4、如果发生异常,那么回滚 hh>mX6A
cn.rollback();