java 数据库基本操作 C,GZ
1、java数据库操作基本流程 }lT;?|n:h
2、几个常用的重要技巧: .{} 8mFi1
可滚动、更新的记录集 qZ&~&f|>e
批量更新 v^vi *c
事务处理 4d-(:
egURRC!
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 #<ST.f@*
1、取得数据库连接 X6 N&:<
1)用DriverManager取数据库连接 o]<9wc:FZ
例子 /
*PHX@
String className,url,uid,pwd; bLAHVi<.
className = "oracle.jdbc.driver.OracleDriver"; 2#r4dr0
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; :tI
F*pC
uid = "system"; R&a$w8
pwd = "manager"; {]Hv*{ ]
Class.forName(className); /-G_0A2wF
Connection cn = DriverManager.getConnection(url,uid,pwd); 9dBxCdpu
2)用jndi(java的命名和目录服务)方式 ,&qC
R
sw
例子 eZN"t~\rX
String jndi = "jdbc/db"; }m~MN4 l
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); @un+y9m[C
DataSource ds = (DataSource) ctx.lookup(jndi); S2_(lS+R
Connection cn = ds.getConnection(); 5j6`W?|q
多用于jsp中 ~!!|#A)W
2、执行sql语句 |ns?c0rM
1)用Statement来执行sql语句 >]z^.U7=
String sql; Z6A-i@
Statement sm = cn.createStatement(); nSC2wTH!1
sm.executeQuery(sql); // 执行数据查询语句(select) F=
%A9b_a
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); > pP&/
2)用PreparedStatement来执行sql语句 GNe^~
String sql; Y)+q[MZ R
sql = "insert into user (id,name) values (?,?)"; XWyP'\
PreparedStatement ps = cn.prepareStatement(sql); \Z&Nd;o
ps.setInt(1,xxx); -THMTRFz
ps.setString(2,xxx); $2?j2}M
... fe,6YXUf
ResultSet rs = ps.executeQuery(); // 查询 =I)43ahd
int c = ps.executeUpdate(); // 更新 ~~ rR< re
. R/y`:1:W
3、处理执行结果 j)6p>6
查询语句,返回记录集ResultSet yxo=eSOM
更新语句,返回数字,表示该更新影响的记录数 m<#12#D
ResultSet的方法 0FgF,
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ;%B9mM#p~
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 V?1 $H
1/2cb-V
4、释放连接 Z>Mv$F"p:
cn.close(); cgSN:$p(R
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection <7`zc7c]#
<.B+&3')
可滚动、更新的记录集 $[n:IDa*@1
1、创建可滚动、更新的Statement T?t/[iuHrj
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); .8Bo5)q$a-
该Statement取得的ResultSet就是可滚动的 ?'9IgT[*
2、创建PreparedStatement时指定参数 d%"XsbO
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); LzNfMvh
ResultSet.absolute(9000); .
yg#
批量更新 Cl]?qH*:
1、Statement @XV&^l-
Statement sm = cn.createStatement(); 2_+>a"8Y
sm.addBatch(sql1); 6AGZ)gX
sm.addBatch(sql2); hN
&?x5aC>
... ]b!n ;{5
sm.executeBatch() -` U|5
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 EZ]4cd/i
2、PreparedStatement EN2SI+
PreparedStatement ps = cn.preparedStatement(sql); U5OX.0
{ pUb1#=
ps.setXXX(1,xxx); ^hmV?a:Y
... _wS=*-fT
ps.addBatch(); (^m]
7l
} 0f.jW O
ps.executeBatch(); #e|o"R;/`
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 2 HEU
dD=$$(
je
事务的处理 ?<TJ}("/
1、关闭Connection的自动提交 49$<:{ ~
cn.setAutoCommit(false); 7upko9d/
2、执行一系列sql语句 h@!p:]
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close hx$61E=
Statement sm ; :Kwu{<rJ!(
sm = cn.createStatement(insert into user...); <f>w"r
sm.executeUpdate(); \7r0]& _
sm.close(); Wye* ~t
sm = cn.createStatement("insert into corp...); !m+Pd.4TaB
sm.executeUpdate(); >|E]??v
sm.close(); 5M0Q'"`F:
3、提交 A51
a/p#
cn.commit(); zVq!M-e
4、如果发生异常,那么回滚 f\]?,
cn.rollback();