java 数据库基本操作 J09jBQ]R
1、java数据库操作基本流程 `0N7G c
2、几个常用的重要技巧: =KUmvV*\
可滚动、更新的记录集 +4.s4&f)
批量更新 :{#O
事务处理 odSPl{. >d
G0{Z@CvO'
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 T#H^
}`
1、取得数据库连接 !uQT4<g
1)用DriverManager取数据库连接 ^3TNj
例子 N(Ru/9!y"
String className,url,uid,pwd; ejlns
~
className = "oracle.jdbc.driver.OracleDriver"; +U2lwd!j
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; "~5cz0
H3v
uid = "system"; P{--R\
pwd = "manager"; HJ]xZ83pC
Class.forName(className); |L8
[+_m
Connection cn = DriverManager.getConnection(url,uid,pwd); R7/S SuG6\
2)用jndi(java的命名和目录服务)方式 Xva(R<W7d<
例子 bAPMD
String jndi = "jdbc/db"; G;3%k.{
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 7-``J#9=
DataSource ds = (DataSource) ctx.lookup(jndi); 4kjfYf@A
Connection cn = ds.getConnection(); ,\s`T O
多用于jsp中 Z-U u/GjB
2、执行sql语句 l cie6'<
1)用Statement来执行sql语句 `UTPX'Vz
String sql; d/bimQ
Statement sm = cn.createStatement(); ${MzOi
sm.executeQuery(sql); // 执行数据查询语句(select) x-m*p^}
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); T@tsM|pI
2)用PreparedStatement来执行sql语句 (T_-`N|
String sql; ~= *o
sql = "insert into user (id,name) values (?,?)"; 3uocAmY
PreparedStatement ps = cn.prepareStatement(sql); z.Ic?Wz7
ps.setInt(1,xxx); bGCC?}\
ps.setString(2,xxx); ==OUd6e}
... >jX"
ResultSet rs = ps.executeQuery(); // 查询 &t^*0/~
int c = ps.executeUpdate(); // 更新 -67Z!N
UDh\%?j
3、处理执行结果 (N}-]%#
查询语句,返回记录集ResultSet ~;3yjO)l?)
更新语句,返回数字,表示该更新影响的记录数 z'U.}27&o
ResultSet的方法 vN'+5*Cgy6
1、next(),将游标往后移动一行,如果成功返回true;否则返回false !fzS' pkk.
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 !+%gJiu:
[UA*We 1
4、释放连接 Jh3
cn.close(); P |tyyjO
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection >$JE!.p%o
C< c6Ub
可滚动、更新的记录集 y>EW,%leC
1、创建可滚动、更新的Statement |%C2 cx
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); XM`GK>*aC(
该Statement取得的ResultSet就是可滚动的 ?$|tT\SFV
2、创建PreparedStatement时指定参数 0f6o0@
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); d}\]!x3t
ResultSet.absolute(9000); 8Yh'/,o=L#
批量更新 [)Nt;|U
1、Statement J<0{3pZY
Statement sm = cn.createStatement(); 9wYm(7M6
sm.addBatch(sql1); ^OKm (
sm.addBatch(sql2); f~NS{gL*
... J8emz8J
sm.executeBatch() N1Vj;-
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 M-nRhso
2、PreparedStatement zMv`<m%
PreparedStatement ps = cn.preparedStatement(sql); -D~K9u]U_
{ VcrMlcnO
ps.setXXX(1,xxx); @Chl>s
... `;j1H<L
ps.addBatch(); uO]D=Z\S(
} ~#E&E%sJ
ps.executeBatch(); q[\ 3,Y
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ,^([aK
8\rca:cF
事务的处理 #yochxF_
1、关闭Connection的自动提交 f)*?Ji|5F
cn.setAutoCommit(false); \}$|Uo$O
2、执行一系列sql语句 dPEDsG0$a
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 5p#0K@`n/
Statement sm ; I{89chi
sm = cn.createStatement(insert into user...); [c3!xHt5O
sm.executeUpdate(); #kv9$
sm.close(); 8g0 #WV
sm = cn.createStatement("insert into corp...); mD9Iao%4~
sm.executeUpdate(); ]`$6=)_X
sm.close(); IU8zidn&
3、提交 :^]Po$fl
cn.commit(); $5i\D
rs
4、如果发生异常,那么回滚 9WG=3!-@
cn.rollback();