java 数据库基本操作 c yP,[?N
1、java数据库操作基本流程 \"'\MA
2、几个常用的重要技巧: z{|LQt6q
可滚动、更新的记录集 >ukQ, CE~
批量更新 (')(d
HHW
事务处理 (8G$(MK
h8jB=e, H
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 +}U2@03I
1、取得数据库连接 Ny^'IUu
1)用DriverManager取数据库连接 ~r&D6Y
例子 iV!@bC,
String className,url,uid,pwd; 5}XvL'
className = "oracle.jdbc.driver.OracleDriver"; 1q]&7R
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; .TJ">?
uid = "system"; ddoFaQ8
pwd = "manager"; (i]Z|@|)
Class.forName(className); 1%jH^,t/m
Connection cn = DriverManager.getConnection(url,uid,pwd); 3 z=\.R
2)用jndi(java的命名和目录服务)方式 v,jhE9_O0
例子 AWT"Y4Ie
String jndi = "jdbc/db"; U<[jT=L
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Oc~aW3*A(
DataSource ds = (DataSource) ctx.lookup(jndi); B6MkF"J<
Connection cn = ds.getConnection(); M&f#wQ
多用于jsp中 w12}Rn8
2、执行sql语句 =!CU $g
1)用Statement来执行sql语句 UOt8Q0)}
String sql; '_0
Statement sm = cn.createStatement(); 5ITq?%{M
sm.executeQuery(sql); // 执行数据查询语句(select) @1g&Z}L
o
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); SO3cY#i
z"
2)用PreparedStatement来执行sql语句 +xp*]a
String sql; oRq3 pO}f
sql = "insert into user (id,name) values (?,?)"; .,M;huRg
PreparedStatement ps = cn.prepareStatement(sql); _*E!gPO
ps.setInt(1,xxx); #ib^Kg
ps.setString(2,xxx); G6Nb{m
... NAJVr}4f
ResultSet rs = ps.executeQuery(); // 查询 )7Ixz1I9g
int c = ps.executeUpdate(); // 更新 W5Zqgsy($F
Xa,\EEmQ
3、处理执行结果 -zKxf@"
查询语句,返回记录集ResultSet Q'K$L9q
更新语句,返回数字,表示该更新影响的记录数 7$7n71o
ResultSet的方法 H\#:,s {1
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ")%r}:0
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 3D_"yZ
){ gAj
4、释放连接 M{E{N K
cn.close(); k. GA8=]>
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection XYAmJ
uR_F,Mp?%u
可滚动、更新的记录集 uPLErO9Es[
1、创建可滚动、更新的Statement m$:&P|!'p
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); X#ZgS!Mn
该Statement取得的ResultSet就是可滚动的 5)M2r!\
2、创建PreparedStatement时指定参数 Fw"$A0
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); eFFc 9'o
ResultSet.absolute(9000); 6Dst;:
批量更新 J(s;$PG
1、Statement 6I>^Pf'ND
Statement sm = cn.createStatement(); h1f8ktF
sm.addBatch(sql1); QDE$E.a
sm.addBatch(sql2); !d8A
... @G*.1;jO
sm.executeBatch() 5I' d PNf
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 QVtM.oi!Q
2、PreparedStatement au$"B/
PreparedStatement ps = cn.preparedStatement(sql); ^npJUa
{ }C,O
ps.setXXX(1,xxx); ;Z9IZ~
... Uc&iZFid2K
ps.addBatch(); C-w5KW
} $Q/Ya@o
ps.executeBatch(); -5k2j^r;
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 #SnvV
Uf$i3
事务的处理 X+l'bp]Ry
1、关闭Connection的自动提交 :E'P7A
cn.setAutoCommit(false); _| zBUrN
2、执行一系列sql语句 62\&RRB
i
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close XYfv(y
Statement sm ; KDTDJ8
sm = cn.createStatement(insert into user...);
q3S+Y9L
sm.executeUpdate(); ST;t,
D:
sm.close(); &&7r+.Y
sm = cn.createStatement("insert into corp...); o~1 Kp!U
sm.executeUpdate(); f*fE};
sm.close(); &HDP!SLS
3、提交 LchnBtjn
cn.commit(); &tE.6^F
4、如果发生异常,那么回滚 /k6fLn2;
cn.rollback();