java 数据库基本操作 =WHdy;
1、java数据库操作基本流程 VRT| OUq
2、几个常用的重要技巧: -`A6K!W&~p
可滚动、更新的记录集 &L;0%
批量更新 vQ
5
p
事务处理 sqsBGFeG
\`x$@s?
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 LB-4/G$
1、取得数据库连接 yQ h":"$k
1)用DriverManager取数据库连接 x|1OGbBK
例子 g#:?Ay-m
String className,url,uid,pwd; !x&/M*nBE
className = "oracle.jdbc.driver.OracleDriver"; [X;yJ $
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; cE[4CCpy
uid = "system"; 3>-^/
pwd = "manager"; }]/"auk
Class.forName(className); n)[{nkS6[
Connection cn = DriverManager.getConnection(url,uid,pwd); )f,iey\-
2)用jndi(java的命名和目录服务)方式 yv&&x.!.Z
例子 Fd0R?d
String jndi = "jdbc/db"; xMU4Av[{
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); TVQ9"C
DataSource ds = (DataSource) ctx.lookup(jndi); J](AJkGzK
Connection cn = ds.getConnection(); 7RDfhKdb
多用于jsp中 4s%vx]E
2、执行sql语句 #5=Yg5
1)用Statement来执行sql语句 V)C4 sG
String sql;
>.0B%
Statement sm = cn.createStatement(); M"1}"ex#
sm.executeQuery(sql); // 执行数据查询语句(select) }c$Zlb
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); XZ}]H_, n
2)用PreparedStatement来执行sql语句 Q. @9"&)t
String sql; >q"mI6F
sql = "insert into user (id,name) values (?,?)"; IrM Ws86;
PreparedStatement ps = cn.prepareStatement(sql); O*X]oX
ps.setInt(1,xxx); MoavA
3`
ps.setString(2,xxx); ljQru ^(u
... zcy!YB
ResultSet rs = ps.executeQuery(); // 查询 >]s|'HTxF
int c = ps.executeUpdate(); // 更新 G-~+F nUC
8-+Ce;h
3、处理执行结果 1d"g$i4e
查询语句,返回记录集ResultSet &KmVtj
更新语句,返回数字,表示该更新影响的记录数 Nxp7/Nn3
ResultSet的方法 xZwG@+U=X
1、next(),将游标往后移动一行,如果成功返回true;否则返回false o^}K]ML!t
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 0p)#!$
$@s&qi_&R
4、释放连接 2ntL7F<ow
cn.close(); +7.\>Ucq`
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection &iORB
wL\OAM6R
可滚动、更新的记录集 3)3?/y)_
1、创建可滚动、更新的Statement jEo)#j];`<
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); uD}Q}]Z
该Statement取得的ResultSet就是可滚动的 !g'kWE[
2、创建PreparedStatement时指定参数 i^f*Em1
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 9'Le}`Gf
ResultSet.absolute(9000); N8#wQ*MM>
批量更新 -c{O!z6sX
1、Statement 'S;INs2|->
Statement sm = cn.createStatement();
&gR)Y3
sm.addBatch(sql1); eVGO6 2|!
sm.addBatch(sql2); B<%cqz@
... 0Q`Dp;a5&
sm.executeBatch() UP' ~D]J
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 .nl!KzO6g
2、PreparedStatement V:s$V.{!
PreparedStatement ps = cn.preparedStatement(sql);
ltK\)L
{ 0}$Zr*|;Y
ps.setXXX(1,xxx); B<zoa=
... >g+yw1nC
ps.addBatch(); OX-t#R`
} P{-j^'y
ps.executeBatch(); G)t_;iNL|
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 o<cg9
F>RL&i
事务的处理 Q8.=w
1、关闭Connection的自动提交 q!iSY
cn.setAutoCommit(false); Se{x-vn?p
2、执行一系列sql语句 z@Pv~"
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close l|RBO+}
Statement sm ; ?71?Vd
sm = cn.createStatement(insert into user...); l!qhK'']V"
sm.executeUpdate(); @cRR
sm.close(); lY
-2e>
sm = cn.createStatement("insert into corp...); D`d*bNR
sm.executeUpdate(); A#k(0e!O
sm.close(); zZp0g^;.?
3、提交 Di)%vU
cn.commit(); 4&N#d;ErC
4、如果发生异常,那么回滚 Pw+PBIGn4
cn.rollback();