java 数据库基本操作 wIvo"|%
1、java数据库操作基本流程 A<MtKb
2、几个常用的重要技巧: z? ]G3$i(
可滚动、更新的记录集 -0uV z)
批量更新 19e8
事务处理 #s5N[uK^m
rRFAD{5)
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 oYM3Rgxf9Q
1、取得数据库连接 hVpCB,
1)用DriverManager取数据库连接 T D@v9
例子 n~IVNB*
String className,url,uid,pwd; 1OaXo!
className = "oracle.jdbc.driver.OracleDriver"; W8WXY_yJt
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; kAYb!h[`
uid = "system"; e /K#>,
pwd = "manager"; GIwh@4;
Class.forName(className); 8(U{2B8>\%
Connection cn = DriverManager.getConnection(url,uid,pwd); ;3'NMk
2)用jndi(java的命名和目录服务)方式 J>vMo@
例子 kSncZ0K{
String jndi = "jdbc/db"; j Ch=@<9
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Q4]4@96Aj
DataSource ds = (DataSource) ctx.lookup(jndi); kLSrj\6I[
Connection cn = ds.getConnection(); ?)4?V\$
多用于jsp中 y(jg#7)
2、执行sql语句 E+95WF|4k"
1)用Statement来执行sql语句 cQNs L
String sql; ]2SI!Ai7
Statement sm = cn.createStatement(); /B3R1kNf|
sm.executeQuery(sql); // 执行数据查询语句(select) E>jh"|f:{
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); a}yXC<}$
2)用PreparedStatement来执行sql语句 &dB-r&4;+
String sql; %q3$|>
sql = "insert into user (id,name) values (?,?)"; !RvRGRSyF
PreparedStatement ps = cn.prepareStatement(sql); lEjwgk {
ps.setInt(1,xxx); Pt,ebL~
ps.setString(2,xxx); CB\{!
... sN=6 gCau
ResultSet rs = ps.executeQuery(); // 查询 jH;Du2w
int c = ps.executeUpdate(); // 更新 `6=-WEo
&]6)LFm
3、处理执行结果 gxNL_(A
查询语句,返回记录集ResultSet ~#K@ADYr
更新语句,返回数字,表示该更新影响的记录数 gk0.zz([
ResultSet的方法 6aft$A}XnD
1、next(),将游标往后移动一行,如果成功返回true;否则返回false L71!J0@a#
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 nSx8E7 |V
-T@`hk`
4、释放连接 ~EiH-z4U
cn.close(); PyC0Q\$%
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection (?)7)5H
U\@A_
B
可滚动、更新的记录集 w*7|dZk{
1、创建可滚动、更新的Statement ;U=q-tb
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); $m$;v<PSe
该Statement取得的ResultSet就是可滚动的 vsB*rP=
2、创建PreparedStatement时指定参数 ;i uQ?MR3
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); . RVVWqW
ResultSet.absolute(9000); n
1b(\PA
批量更新 Z3KO90O!8
1、Statement ='?:z2lJ
Statement sm = cn.createStatement(); q6#<[ 4?
sm.addBatch(sql1); R6;Phdh<>
sm.addBatch(sql2); b,H[I!. %
... ;zTuKex~
sm.executeBatch() ={2!c0s
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 nwI3| &
2、PreparedStatement +\
_{x/u1
PreparedStatement ps = cn.preparedStatement(sql); eP1nUy=T
{ 5/><$06rq
ps.setXXX(1,xxx); ^?"\?M1
... bp<^R
ps.addBatch(); \`.F\Z
} E8\XNG)V4
ps.executeBatch(); -[7O7'
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 #U7_a{cn"M
)P&9A)8
事务的处理 y8Xv~4qQW
1、关闭Connection的自动提交 5i6
hp;=
cn.setAutoCommit(false); >B -q@D
2、执行一系列sql语句 AIl4]F5I
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ~!iQ6N?PY
Statement sm ; j F"YTr6
sm = cn.createStatement(insert into user...); | $^;wP
sm.executeUpdate(); U
5w:"x
sm.close(); z$lF)r:Bc
sm = cn.createStatement("insert into corp...); CBT>"sYE1
sm.executeUpdate(); 5MTgK=c
sm.close(); Lm*VN~2
3、提交 CJknJn3m&
cn.commit(); 0BPMmk
4、如果发生异常,那么回滚 IakKi4(
cn.rollback();