java 数据库基本操作 S&@uY#_(*T
1、java数据库操作基本流程 {g *kr1JM
2、几个常用的重要技巧: F$FCfP7
可滚动、更新的记录集 %<q l
批量更新 Y.qlY3iBp
事务处理 7)NQK9~
F~dq7AS
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 F.b;O :
1、取得数据库连接 J:,>/')n
1)用DriverManager取数据库连接 ~/6m|k
例子 Fa$ pr`
String className,url,uid,pwd; s:UQ~p}"S
className = "oracle.jdbc.driver.OracleDriver"; 2c.~cNx`q[
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; R)"Y40nW
uid = "system"; 37 wm[Z
pwd = "manager"; 42?X)n>
Class.forName(className); t>h<XPJi
Connection cn = DriverManager.getConnection(url,uid,pwd); `<h}Ygo>k/
2)用jndi(java的命名和目录服务)方式 \5$N>
2kO
例子 _W4i?Bde
String jndi = "jdbc/db"; \w!G
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ki#O ^vl
DataSource ds = (DataSource) ctx.lookup(jndi); gg(^:`+
Connection cn = ds.getConnection(); w<<G}4~u|
多用于jsp中 z6vRTY
2、执行sql语句 zlmb_akJ
1)用Statement来执行sql语句 ANy=f-V
String sql; \Clz#k8l1
Statement sm = cn.createStatement(); 0sq1SHI{
sm.executeQuery(sql); // 执行数据查询语句(select) `J^J_s
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 9KVeFl
2)用PreparedStatement来执行sql语句 =j 6amk-
String sql; AAkdwo
sql = "insert into user (id,name) values (?,?)"; @ba5iIt
PreparedStatement ps = cn.prepareStatement(sql); x[3kCa|4A
ps.setInt(1,xxx); -Rhxib|<
ps.setString(2,xxx); >+=)Q,|R
... \eE0Rnaf-
ResultSet rs = ps.executeQuery(); // 查询 2jf-vWV_
int c = ps.executeUpdate(); // 更新 iKa}@U
t nz
BNW8
3、处理执行结果
AA9OElCa
查询语句,返回记录集ResultSet Ud0%O
更新语句,返回数字,表示该更新影响的记录数 P. P3/,
ResultSet的方法 '}*5ee](S
1、next(),将游标往后移动一行,如果成功返回true;否则返回false rp.S4;=Q 9
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 |lIkmW{
~a8J"Wh
4、释放连接 yOGaW~
cn.close(); KL!k'4JNY
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection P8e1J0A
K3&v6 #]
可滚动、更新的记录集 VY$hg
1、创建可滚动、更新的Statement ;8;nY6Ie
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); g6$X {
该Statement取得的ResultSet就是可滚动的 *plsZ*Q8
2、创建PreparedStatement时指定参数 *TA${$K
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); !mrB+<:
ResultSet.absolute(9000); ~wIVw}
批量更新 ehI*cf({
1、Statement Qw.""MLmN8
Statement sm = cn.createStatement(); dRyK'Xr
sm.addBatch(sql1); 0O?B!Jr]RM
sm.addBatch(sql2); X&h4A4#P
... w*r.QzCu,5
sm.executeBatch() X~Uvh8O
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 w-R>gdm
2、PreparedStatement q[Hxy
PreparedStatement ps = cn.preparedStatement(sql); Nhn5 iN1*
{ '5KgRK"
ps.setXXX(1,xxx); Ze'AZF
... u#?K/sU
ps.addBatch(); vV-ATIf
^
} 3@?#4]D{'
ps.executeBatch(); Ob?>zsx
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 "[(_C&Ot4
)h,+>U@
事务的处理 `!DrB08A
1、关闭Connection的自动提交 <DiD8")4
cn.setAutoCommit(false); N
VzR 2
2、执行一系列sql语句 e~c;wP~cO
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close &h-d\gMJ
Statement sm ; *'vX:n&t
sm = cn.createStatement(insert into user...); 3Ec5:Caz
sm.executeUpdate(); m,$oV?y>j
sm.close(); Ck2O?Ne
sm = cn.createStatement("insert into corp...); uh%%MhTjv
sm.executeUpdate(); ,IxAt&kN
sm.close(); q"'^W<i
3、提交 zuWj@YG\.
cn.commit(); xj)*K%re
4、如果发生异常,那么回滚 ,:G.V
cn.rollback();