java 数据库基本操作 <#wVQ\0C
1、java数据库操作基本流程 i;atYltEJ2
2、几个常用的重要技巧: ({zWyl
可滚动、更新的记录集 UxxX8N
批量更新 g^}C/~b[
事务处理 W] WH4.y
gA`QV''/:
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 7GTDe'T
1、取得数据库连接 (*b<IGi;
1)用DriverManager取数据库连接 +|x{?%.O
例子 P4zwTEk`
String className,url,uid,pwd; (xE |T f
className = "oracle.jdbc.driver.OracleDriver"; /M JI^\CA
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; /~Bs5f.]?
uid = "system"; l-P6B9e|\
pwd = "manager"; 5KfrkZ
Class.forName(className); N/'8W9#6
Connection cn = DriverManager.getConnection(url,uid,pwd);
peHjKK
2)用jndi(java的命名和目录服务)方式 ,!, tU7-H
例子 `kE7PXqa
String jndi = "jdbc/db"; M.xZU\'ty
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); D2GF4%|
DataSource ds = (DataSource) ctx.lookup(jndi); } '?qUy3x
Connection cn = ds.getConnection(); _%er,Ed
多用于jsp中 S dN&%(ZE
2、执行sql语句 L[Ot$
1)用Statement来执行sql语句 6Xz d>5x
String sql; 8#\|Y~P
Statement sm = cn.createStatement(); oHr0;4Lg6
sm.executeQuery(sql); // 执行数据查询语句(select) /M'd$k"0z
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); U{j4FlB
2)用PreparedStatement来执行sql语句 r{B28'f[
String sql;
2;j<{'
sql = "insert into user (id,name) values (?,?)"; 9 *uK]/c
PreparedStatement ps = cn.prepareStatement(sql); w3 kkam"
ps.setInt(1,xxx); vaJl}^T
ps.setString(2,xxx); mP=[h
|a$r
... TtF+~K
ResultSet rs = ps.executeQuery(); // 查询 lT*@f39~g
int c = ps.executeUpdate(); // 更新 '9=b@SaAj
|N^"?bSt
3、处理执行结果 Qwt0~9n(
查询语句,返回记录集ResultSet g?xD*3<
更新语句,返回数字,表示该更新影响的记录数 Aix6O=K6
ResultSet的方法 :<mJRsDf
1、next(),将游标往后移动一行,如果成功返回true;否则返回false F+GX{e7E\
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 wdAKU+tM
}O>4XFj
4、释放连接 hv?T}E
cn.close(); [& Z-
*a
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection iE}] E
/ Y od
可滚动、更新的记录集 j "'a5;Sy
1、创建可滚动、更新的Statement E#_2t)20
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 7#d:TXS
该Statement取得的ResultSet就是可滚动的 wJ pb$;
2、创建PreparedStatement时指定参数 @HiGc^X(
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); wViTMlq
ResultSet.absolute(9000); ?AD-n6
批量更新 nGe4IY\-w
1、Statement (# mvDz
Statement sm = cn.createStatement(); E
N%{ $
sm.addBatch(sql1); ;[UI]?A%
sm.addBatch(sql2); e[?,'Mp9
... h]L.6G|hEN
sm.executeBatch() BWQ`8
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 SMIDW}U2S
2、PreparedStatement <F(S_w62
PreparedStatement ps = cn.preparedStatement(sql); [qW%H,_
{ 4sntSlz)~k
ps.setXXX(1,xxx); 2$kB^g!:o
... Il9xNVos#
ps.addBatch(); Y,GlAr s4
} tk R~(h
ps.executeBatch(); <tBT?#C9+
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 9 " t;6
z@,(^~C_
事务的处理 ||Owdw|{
1、关闭Connection的自动提交 X'<RqvDc5
cn.setAutoCommit(false); VBQAkl?(}4
2、执行一系列sql语句 %qz-b.
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ;y. ;U#O
Statement sm ; \Cu=Le^
sm = cn.createStatement(insert into user...); k(pJVez
sm.executeUpdate(); 1;1;-4k7I
sm.close(); YJMs9X~3
sm = cn.createStatement("insert into corp...); l"A/6r!Dp
sm.executeUpdate(); Exqz$'(W9
sm.close(); 7%EIn9P
3、提交 ZzNHEV
cn.commit(); qqe"hruFJ
4、如果发生异常,那么回滚 .B-b51Uz
cn.rollback();