java 数据库基本操作 q~>!_q]FE
1、java数据库操作基本流程
,]wab6sY
2、几个常用的重要技巧: W *0!Z:?
可滚动、更新的记录集 4n#u?)
批量更新 H
Qj,0#J)
事务处理 y^r'4zN'
X&Oo[Z
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 u`EK^\R
1、取得数据库连接 S5|7D[*
1)用DriverManager取数据库连接 yCz"~c
例子 (R=ZI
String className,url,uid,pwd; [KUkv
className = "oracle.jdbc.driver.OracleDriver"; `&I6=,YLp
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ~ESw* 6s9
uid = "system"; <\*)YKjn/@
pwd = "manager"; {9J|\Zz3
Class.forName(className); W3l[a^1d
Connection cn = DriverManager.getConnection(url,uid,pwd); d{TcjZ
2)用jndi(java的命名和目录服务)方式 +@$VJM%^7b
例子 l|842N@1
String jndi = "jdbc/db"; yXkQ
,y
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); /{({f?k<\/
DataSource ds = (DataSource) ctx.lookup(jndi); C,;?`3bH@
Connection cn = ds.getConnection(); J^t0M\
多用于jsp中 `+=Zq :0
2、执行sql语句 C,,T7(: k
1)用Statement来执行sql语句 ^uX"04>;
String sql; BTsvL>Wy
Statement sm = cn.createStatement(); xb7!!PR
sm.executeQuery(sql); // 执行数据查询语句(select) -0uGzd+m*
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); r
E1ouz!D
2)用PreparedStatement来执行sql语句 /XG7M=A$o
String sql; Cpzd k~+H
sql = "insert into user (id,name) values (?,?)"; s"7FmJ\7rw
PreparedStatement ps = cn.prepareStatement(sql); }?b\/l<
ps.setInt(1,xxx); +%CXc%
ps.setString(2,xxx); W)`>'X`
... EQnU:a
ResultSet rs = ps.executeQuery(); // 查询 Ym%#"
int c = ps.executeUpdate(); // 更新 6n:X
p_yO
~m R^j
3、处理执行结果 w2$ L;q
查询语句,返回记录集ResultSet 2C0j.Ib
更新语句,返回数字,表示该更新影响的记录数 2SC'Z>A
ResultSet的方法 0#c-qy
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 1`II%mf[
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 JAW7Y:XB
*{JD=ua
4、释放连接 =5:vKL j
cn.close(); d*!H&1L
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection I9TNUZq('
=PU@'OG
可滚动、更新的记录集 0o6r3xc;
1、创建可滚动、更新的Statement 5Bcmz'?!
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); X:FyNUa
该Statement取得的ResultSet就是可滚动的 ;J?fK69%
2、创建PreparedStatement时指定参数 mGz'%?zj
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); sS)tSt{C
ResultSet.absolute(9000); zv1,DnkqF
批量更新 kPEU }Kv
1、Statement +Kmxo4p
Statement sm = cn.createStatement(); uA?a
DjA
sm.addBatch(sql1); F0m[ls$
sm.addBatch(sql2); C#&b`
... w6 Y+Y;,'f
sm.executeBatch() _ru<1n[4~
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 YU87l
2、PreparedStatement M/[9ZgDc
PreparedStatement ps = cn.preparedStatement(sql); xZAg
{ q9(O=7O]-
ps.setXXX(1,xxx); E?0RR'
... Nf~B 1vkp
ps.addBatch(); !/F-EJOH6C
} b9f5
ps.executeBatch(); 11J:>A5zt
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 oOQan
}WQ:Rmi
事务的处理 $~EY:
1、关闭Connection的自动提交 Y\H4.$V
cn.setAutoCommit(false); xAsy07J?
2、执行一系列sql语句 .<P@6Jq
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close (yu0iXZY
Statement sm ; }Ny~.EV5^
sm = cn.createStatement(insert into user...); I1ibrn
sm.executeUpdate(); yC}x6xG
sm.close(); g2lv4Tiq-
sm = cn.createStatement("insert into corp...); B*Q.EKD8s
sm.executeUpdate(); a0FU[*q
sm.close(); i;)r|L`V?
3、提交 u<@
55k
cn.commit(); V6<Ki
4、如果发生异常,那么回滚 !OH'pC5
cn.rollback();