java 数据库基本操作 v !~lVv&
1、java数据库操作基本流程 j Y>BU&
2、几个常用的重要技巧: sx ;7
可滚动、更新的记录集 G@Z,Hbgm
批量更新 N`FgjnQ`
事务处理 "XWrd[Df
R<}n?f\#JZ
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 }B{bM<dF
1、取得数据库连接 K&zp2V
1)用DriverManager取数据库连接 uyt]\zVT
例子 ]]
R*sd*
String className,url,uid,pwd; ?0>%
a$`
className = "oracle.jdbc.driver.OracleDriver"; (Kl96G<Wej
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; <r_L-
uid = "system"; F;5S2:a@Z
pwd = "manager"; g$c\(isY;
Class.forName(className); m{(G%n>E&
Connection cn = DriverManager.getConnection(url,uid,pwd); 'lPt.*Y<u
2)用jndi(java的命名和目录服务)方式 vf=b5s(7Q
例子 0ZY.~b'eu
String jndi = "jdbc/db"; Ax*=kZmH|
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); -!OFt}
DataSource ds = (DataSource) ctx.lookup(jndi);
~yQby&s
Connection cn = ds.getConnection(); P8lx\DA
多用于jsp中 d4Y8q1
2、执行sql语句 |!VSed#FSn
1)用Statement来执行sql语句 ou;E@`h;x
String sql; n>d@}hyv
Statement sm = cn.createStatement(); 39jnoT
sm.executeQuery(sql); // 执行数据查询语句(select) 3snr-)
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); %?gh;? GD
2)用PreparedStatement来执行sql语句 *U vh;d{
String sql; x>5"7MR`
sql = "insert into user (id,name) values (?,?)"; /&g5f4[|p
PreparedStatement ps = cn.prepareStatement(sql); *~~&*&+
ps.setInt(1,xxx); :x*|?zII
ps.setString(2,xxx); ^l}Esz`-M
... [<;4$}f\
ResultSet rs = ps.executeQuery(); // 查询 6xk~Bt
int c = ps.executeUpdate(); // 更新 v7?sXW
}P8@\2@=T
3、处理执行结果 xh$1Rwa
查询语句,返回记录集ResultSet FdR!jt
更新语句,返回数字,表示该更新影响的记录数 !;";L5()
ResultSet的方法 ;9>(yJI+
1、next(),将游标往后移动一行,如果成功返回true;否则返回false biTET|U`$
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 vs3px1Xe#
Bnju_)U5)
4、释放连接 V=)0{7-9
cn.close(); )24c(
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection t2)S61Vr
%A@Q %l6
可滚动、更新的记录集 zmV5k
1、创建可滚动、更新的Statement VqzcTr]_
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); L0\97AF
该Statement取得的ResultSet就是可滚动的
0G-M.s}A
2、创建PreparedStatement时指定参数 Jx#r
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); OF^:_%c/
ResultSet.absolute(9000); g`6_Ao8
批量更新 {U:c95#.!S
1、Statement qDR`)hle
Statement sm = cn.createStatement(); *>x~`
sm.addBatch(sql1); MdzG2uZT
sm.addBatch(sql2); /s91[n(d
... }pP<+U
sm.executeBatch() GfEg][f
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 @<$-*,
2、PreparedStatement ig
Mm.1>
PreparedStatement ps = cn.preparedStatement(sql); JI{|8)S
{ ~*WSH&ip
ps.setXXX(1,xxx); 8Vcg30_+
... bVEt?E*+
ps.addBatch(); Ood8Qty(
} y6.Q\=
ps.executeBatch(); ?W l=F/
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。
de.!~%D
%kM|Hk3d
事务的处理 8*sZ/N.
1、关闭Connection的自动提交 +b<q4W
cn.setAutoCommit(false); &X0qH8W
2、执行一系列sql语句 }O+F#/6
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close o.qeF4\d6
Statement sm ; u`Ew^-">
sm = cn.createStatement(insert into user...); 2=X\G~a
sm.executeUpdate(); ?NV3]vl
sm.close(); $S~e"ca1
sm = cn.createStatement("insert into corp...); jD@KG
sm.executeUpdate(); 2rS|V|d
sm.close(); y#[PQT
3、提交 obUX7N
cn.commit(); cN/8b0C
4、如果发生异常,那么回滚 cTy;?(E
cn.rollback();