java 数据库基本操作 ix.I)
1、java数据库操作基本流程 6;JlA})
2、几个常用的重要技巧: h5+L/8+J^z
可滚动、更新的记录集 ()Cw;N{E
批量更新 <G+IbUG:
事务处理 K<#Q;(SF U
S.iCkX
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 TOH!vQP
1、取得数据库连接 Tj[=E
1)用DriverManager取数据库连接 tN-U,6c]
例子 P&3Z,f0
String className,url,uid,pwd; {Z~5#<t
className = "oracle.jdbc.driver.OracleDriver"; gGdt&9z
%
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; hXF#KVqx
uid = "system"; s,~p}A%0
pwd = "manager"; 'f'zV@)
Class.forName(className); Imv]V6"D=
Connection cn = DriverManager.getConnection(url,uid,pwd); A9:dHOmT^U
2)用jndi(java的命名和目录服务)方式 gk-g!v&
例子 e<.O'!=7Y
String jndi = "jdbc/db"; reO^_q'
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); J~"h&>T
DataSource ds = (DataSource) ctx.lookup(jndi); CVk.Ez6
Connection cn = ds.getConnection(); q!r4"#Y"@Z
多用于jsp中 L("zS%qr
2、执行sql语句 8Q wn
1)用Statement来执行sql语句 #YEOY#
String sql; uaiCyh1:
Statement sm = cn.createStatement(); x JXPtm
sm.executeQuery(sql); // 执行数据查询语句(select) .66_g@1
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); dc]D 8KX
2)用PreparedStatement来执行sql语句 ,p3moD
3
String sql; cz{5-;$9Z
sql = "insert into user (id,name) values (?,?)"; TmH'_t.*T~
PreparedStatement ps = cn.prepareStatement(sql); y,YK Mc
ps.setInt(1,xxx); S(&]?!
ps.setString(2,xxx); J/-&Fa\(
... 0q4E^}iR
ResultSet rs = ps.executeQuery(); // 查询 :\Pk>a
int c = ps.executeUpdate(); // 更新 &I= 27!S
v \xuq`
3、处理执行结果 rzk]{W
查询语句,返回记录集ResultSet z[E gMS!
更新语句,返回数字,表示该更新影响的记录数 XFS"~{
ResultSet的方法 7UV hyrl
1、next(),将游标往后移动一行,如果成功返回true;否则返回false dI$U{;t
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ~[wh
mh5ozv$
4、释放连接 O)Wc\-
cn.close(); )^D:VY92
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection =xf7lN'
cW|M4`
可滚动、更新的记录集 I7Uj<a=(q
1、创建可滚动、更新的Statement @/DHfs 4O
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); m0$4
该Statement取得的ResultSet就是可滚动的 s{30#^1R
2、创建PreparedStatement时指定参数 n#.~XNbxv
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); }BR@vY'd
ResultSet.absolute(9000); hU]Gv)B
批量更新 p%?VW
1、Statement Q^Lk^PP7
Statement sm = cn.createStatement();
)ld !(d=
sm.addBatch(sql1); Z:e|~#
sm.addBatch(sql2); p1mY@[A
... <gtqwH]
sm.executeBatch() W/?\ 8AE
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 jcY:a0 [{D
2、PreparedStatement piy_9nk
PreparedStatement ps = cn.preparedStatement(sql); =ghN)[AZV
{ LY? `+/
ps.setXXX(1,xxx); sC ^9
... X
/
{;
ps.addBatch(); :VB{@ED
} 5|pPzEA>
ps.executeBatch(); U>@st="
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 HK/T`p#
u\uY q
事务的处理 b5Sgf'B^
1、关闭Connection的自动提交 e; #"t
cn.setAutoCommit(false); c-ud $0)c
2、执行一系列sql语句 ZB|y
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close W :qQ
Statement sm ; lZI?k=rWv
sm = cn.createStatement(insert into user...); `1Cg)\&[e0
sm.executeUpdate(); w QnW2)9!
sm.close(); U,_jb}$Sq7
sm = cn.createStatement("insert into corp...); Js706
sm.executeUpdate(); F79!B
sm.close(); N-~Uu6zr
3、提交 ujt0?DM
cn.commit(); Oosr`e@S
4、如果发生异常,那么回滚 ._$tNGI4
cn.rollback();