java 数据库基本操作 -Ph"#R&
1、java数据库操作基本流程 QN)EPS:y
2、几个常用的重要技巧: pV[SY6/
可滚动、更新的记录集 C( wZjO?N
批量更新 \3q Z0
事务处理 I' [gGK4F
xe`SnJgA
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 djmd
@{Djt
1、取得数据库连接 o=C:=
1)用DriverManager取数据库连接 zpgRK4p,I"
例子 ;V v.$mI
String className,url,uid,pwd; ;T hn C>U
className = "oracle.jdbc.driver.OracleDriver"; 6
9+Pf*
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; b=+3/-d
uid = "system"; ,)?!p_*@:
pwd = "manager"; "vvv@sYxi
Class.forName(className); SR>(GQ,m0;
Connection cn = DriverManager.getConnection(url,uid,pwd); C:r3z50
2)用jndi(java的命名和目录服务)方式 jEMnre3/
例子 _kEU=)Xe
String jndi = "jdbc/db"; gkhmQd
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 4LXC;gZ
DataSource ds = (DataSource) ctx.lookup(jndi); ,,8'29yEq
Connection cn = ds.getConnection(); <5O:jd
多用于jsp中 pL5Bz!_r
2、执行sql语句 xcE2hK/+
1)用Statement来执行sql语句 VW\xuP
String sql; WU\Bs2
Statement sm = cn.createStatement(); N1fPutl$a
sm.executeQuery(sql); // 执行数据查询语句(select) ROi_k4Fj
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Qa#Em1co
2)用PreparedStatement来执行sql语句 W#9A6ir>
String sql; 0d/
f4
sql = "insert into user (id,name) values (?,?)"; b?,''t
PreparedStatement ps = cn.prepareStatement(sql); Y>2oU`ly,
ps.setInt(1,xxx); T&ib]LmR
ps.setString(2,xxx); yYH>~,
... f]NaQ!.
7
ResultSet rs = ps.executeQuery(); // 查询 {VE1c'E"V?
int c = ps.executeUpdate(); // 更新 >)t-Zh:n
?>Bt|[p:s)
3、处理执行结果 ~--b#o{
查询语句,返回记录集ResultSet (j&7`9<5
更新语句,返回数字,表示该更新影响的记录数 m`&6[[)6~
ResultSet的方法 8a;;MJ)
1、next(),将游标往后移动一行,如果成功返回true;否则返回false J3 xi5S
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 |Hv8GT
Dc9Fb^]QOG
4、释放连接 .h-k*F0Ga)
cn.close(); Bq~?!~\?.
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection xzw2~(lo
F%I*m^7d
可滚动、更新的记录集 LIRL`xU7
1、创建可滚动、更新的Statement T5eJIc3a"
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); `svOPB4C'
该Statement取得的ResultSet就是可滚动的 m!WDXt
2、创建PreparedStatement时指定参数 |!cM_&
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); u vyvy
ResultSet.absolute(9000); 72\o6{BiC
批量更新 rT'<6]`
1、Statement Lpk`qJ
Statement sm = cn.createStatement(); oz'^.+uvE
sm.addBatch(sql1); iza.' Mm~
sm.addBatch(sql2); LIh71Vg/cc
... gmCB4MO
sm.executeBatch() uDMyO<\
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 s x) x7
2、PreparedStatement ^}4ysw
PreparedStatement ps = cn.preparedStatement(sql); 72sBx3 ;
{ Q oWjC
ps.setXXX(1,xxx); `7Dj}vVu
... !}J19]\
ps.addBatch(); D n}TO*
} #1[Q?e4,0
ps.executeBatch(); &Ui&2EW
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 8]&lUMaqVZ
-hKtd3WbT
事务的处理 pJ_>^i=
1、关闭Connection的自动提交 oI9-jW
cn.setAutoCommit(false); @,SN8K0T
2、执行一系列sql语句 PF]Vt
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close O;RNmiVoq
Statement sm ; 'p4b8:X
sm = cn.createStatement(insert into user...); *Vp$#Rb
sm.executeUpdate(); du^r EMb%
sm.close(); MJ~)CiKgN
sm = cn.createStatement("insert into corp...); 33w(Pw
sm.executeUpdate(); G2hBJTW
sm.close(); K9Bi2/N
3、提交 (N$$N:ac[t
cn.commit(); YbE1yOJ&m
4、如果发生异常,那么回滚 f2FGod<CzN
cn.rollback();