java 数据库基本操作 Jf<+VJ>t
1、java数据库操作基本流程 tvH{[e$
2、几个常用的重要技巧: X{SD3j=G#
可滚动、更新的记录集 /b *VFA/75
批量更新 6qsT/
事务处理 2jQ|4$9j
h= uv4&
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 OidF{I*O
1、取得数据库连接 G813NoS o
1)用DriverManager取数据库连接 l1X&Nw1W
例子 <mE)&7C
String className,url,uid,pwd; -V
Rby
className = "oracle.jdbc.driver.OracleDriver"; t/?x#X
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; %M+ID['K9/
uid = "system"; ulM6R/V:?
pwd = "manager"; i#$N,kt
Class.forName(className); `'BvUTDyZ
Connection cn = DriverManager.getConnection(url,uid,pwd); 16q"A$
2)用jndi(java的命名和目录服务)方式 ]=5nC)|
例子 ,U_p6TV5
String jndi = "jdbc/db"; T\g%.
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 3c<).aC0f
DataSource ds = (DataSource) ctx.lookup(jndi); Y|bCbaF
Connection cn = ds.getConnection(); :-x F=Y(;
多用于jsp中 ^MPl
wx
2、执行sql语句 Og8:
1)用Statement来执行sql语句 h#K863
String sql; |2,'QTm=
Statement sm = cn.createStatement(); 0)}bJ,5/
sm.executeQuery(sql); // 执行数据查询语句(select) ;M '?k8L
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); cnh\K.*}_x
2)用PreparedStatement来执行sql语句 ]V!q"|
String sql; ~`Q8)(y<#$
sql = "insert into user (id,name) values (?,?)"; ^cO^3=
PreparedStatement ps = cn.prepareStatement(sql); &PRu[!
ps.setInt(1,xxx); <&3qFK*9r
ps.setString(2,xxx); !|P>%bi
... \wY? 6#;
ResultSet rs = ps.executeQuery(); // 查询 _9!_fIY
int c = ps.executeUpdate(); // 更新 Xz`?b4i
=y"
lX{}G
3、处理执行结果 g0-hN%=6
查询语句,返回记录集ResultSet ;qT~81
更新语句,返回数字,表示该更新影响的记录数 /p|]*={
ResultSet的方法 Jq1 Zb
1、next(),将游标往后移动一行,如果成功返回true;否则返回false !QoOL<(){
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 k8E'wN
ZRYs7 4<
4、释放连接 uVJ;1H!
cn.close(); $Bd{Y"P@6
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ]kC/b^~+m
^hOnLy2
可滚动、更新的记录集 j'lfH6_')e
1、创建可滚动、更新的Statement PfTjC"`,
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); D0(QZrVa
该Statement取得的ResultSet就是可滚动的 mgeNH~%m@*
2、创建PreparedStatement时指定参数 p;av63i
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Bor _Kib
ResultSet.absolute(9000); "7_6iB&@<
批量更新
yE3g0@*
1、Statement M~Tq'>Fn
Statement sm = cn.createStatement(); <'H^}gQow
sm.addBatch(sql1); #&vP(4p
sm.addBatch(sql2); _iBNy
... S[!-M\b
sm.executeBatch() VIo %((
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 :5?g<@
2、PreparedStatement mVGQyX
PreparedStatement ps = cn.preparedStatement(sql); jdxwS
{ B9;dX6c
ps.setXXX(1,xxx); 2[i:bksjW
... D 6!`p6r+
ps.addBatch(); HpI[Af}l
} mq@2zE`.(
ps.executeBatch(); 7B
GMG|
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 @$ E&H`da
aML?$_6
事务的处理 `A O_e4D0i
1、关闭Connection的自动提交 <TmMUA)`}
cn.setAutoCommit(false); 3QSP](W-(
2、执行一系列sql语句 yRaB\'
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close H:x=v4NgsU
Statement sm ; wPTXRq%
sm = cn.createStatement(insert into user...); 9j458Yd4*
sm.executeUpdate(); tiJY$YqA
sm.close(); >jU.R;H5
sm = cn.createStatement("insert into corp...); .L'>1H]B
sm.executeUpdate(); FJl#NOp&
sm.close(); _1[5~Pnh
3、提交 nunTTE,iq%
cn.commit(); ON~jt[
4、如果发生异常,那么回滚 9J%
~?k
cn.rollback();