java 数据库基本操作 _A~4NW{U7
1、java数据库操作基本流程 q}FVzahv
2、几个常用的重要技巧: 4Ua>Yw0
可滚动、更新的记录集 1lpwZ"
批量更新 ehA;i.n
事务处理 42 \-~]
Nlj^Dm
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 @EoZI~
1、取得数据库连接 )aX2jSp
1)用DriverManager取数据库连接 v<9&B94z
例子 Cz8f1suO4
String className,url,uid,pwd; 1LY8Ma]E
className = "oracle.jdbc.driver.OracleDriver"; o#[ KS:Y
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Q_vW3xz
uid = "system"; U #~;)fZ
pwd = "manager"; ]0r|_)s
Class.forName(className); cGwf!hA
Connection cn = DriverManager.getConnection(url,uid,pwd); p)~lL
2)用jndi(java的命名和目录服务)方式 Tb1U^E:
例子 S{K0.<,E
String jndi = "jdbc/db"; 8/"fWm/
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); q-Qxbg[>e
DataSource ds = (DataSource) ctx.lookup(jndi); P6Mhbmt9*
Connection cn = ds.getConnection(); wP/A^Rs
多用于jsp中 Eaqca{%/^
2、执行sql语句 ?J,AB #+
1)用Statement来执行sql语句 Cbs5dn(Y
String sql; _|''{kj(
Statement sm = cn.createStatement(); Cb:gH}j
sm.executeQuery(sql); // 执行数据查询语句(select) WGAXIQ
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); nPUqMn'
2)用PreparedStatement来执行sql语句 DSxUdEK6
String sql; .6~`Ubr}E
sql = "insert into user (id,name) values (?,?)"; dz[
bm<T7
PreparedStatement ps = cn.prepareStatement(sql); 1w"8~Z:UXV
ps.setInt(1,xxx); g`>og^7g
ps.setString(2,xxx); R3X{:1{j
... vEG'HOP
ResultSet rs = ps.executeQuery(); // 查询 fKtV'/X;Q
int c = ps.executeUpdate(); // 更新 c={Ft*N
J/A[45OD
3、处理执行结果 syzdd
an
查询语句,返回记录集ResultSet 4"=Vq5
更新语句,返回数字,表示该更新影响的记录数 @d&/?^dp6
ResultSet的方法 :3$}^uzIq
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ]P[%Mhg^
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 |p00j|k
X#w%>al
4、释放连接 :h,`8 Di
cn.close(); ^JR;epVJ
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ]Zf6Yw .Y
mNYl@+:psj
可滚动、更新的记录集 0L^u2HZYL
1、创建可滚动、更新的Statement \x>65;
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); O3o: qly!
该Statement取得的ResultSet就是可滚动的 >ulY7~wUv
2、创建PreparedStatement时指定参数 jtm?z c
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ]8;n{ }X
ResultSet.absolute(9000); #;#3%?
批量更新 ~}DQT>7$
1、Statement
>`jU`bR@
Statement sm = cn.createStatement(); z}Jr^>
sm.addBatch(sql1); s4H2/EC
sm.addBatch(sql2); '!1$9o^$
... t_ur&.^SB
sm.executeBatch() A`6ra}U<
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 )$Z(|M4
2、PreparedStatement @uH#qg7
PreparedStatement ps = cn.preparedStatement(sql); _DP|-bp D
{ Fd\e*ww'
ps.setXXX(1,xxx); A4mSJ6K]
... >\A8#@1
ps.addBatch(); k#:2'!7G
} (5$ZvXx?}
ps.executeBatch(); 9tg)Mo%
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 /( 6|{B
~]L}p
事务的处理 j*;N\;iL!*
1、关闭Connection的自动提交 sn{A wF%
cn.setAutoCommit(false); Zt E##p
2、执行一系列sql语句 fMf&?`V
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close kJ)gP 2E
Statement sm ; 9TxyZL
sm = cn.createStatement(insert into user...); as"N=\N
sm.executeUpdate(); /\Q*MLwD
sm.close(); nkeI60
sm = cn.createStatement("insert into corp...); B
?%L
sm.executeUpdate(); UF__O.l__
sm.close(); qO`qJ/
3、提交 C0x"pO7
cn.commit(); _U)%kY8
4、如果发生异常,那么回滚 iz]rFNR
cn.rollback();