java 数据库基本操作 c}#(,<8X
1、java数据库操作基本流程 ig:z[k?
2、几个常用的重要技巧: v|YJ2q?19
可滚动、更新的记录集 VDPq3`$+v{
批量更新 Wi!$bL`l
事务处理 ' ui`EL %
VV=6v;u`
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ]hA]o7k
1、取得数据库连接 LfG$?<}hR
1)用DriverManager取数据库连接 Kl+4A}Uo
例子 dY]iAJ
String className,url,uid,pwd; b]5S9^=LI
className = "oracle.jdbc.driver.OracleDriver"; '5SO3/{b
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; %Z#[{yuFs
uid = "system"; Ya,(J0l
pwd = "manager"; ^NOy:>
Class.forName(className); =zKbvwe%X
Connection cn = DriverManager.getConnection(url,uid,pwd); F[U0TP@&*
2)用jndi(java的命名和目录服务)方式 <x1H:8A
例子 $*dY f
String jndi = "jdbc/db"; !EO
2
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); kpO+
DataSource ds = (DataSource) ctx.lookup(jndi); +8V|
Connection cn = ds.getConnection(); kX]p;C
多用于jsp中 7#iT33(3
2、执行sql语句 C)qP9uW
1)用Statement来执行sql语句 ,DWC=:@X
String sql; fm^)u"
Statement sm = cn.createStatement(); 38(|a5
sm.executeQuery(sql); // 执行数据查询语句(select) :vy./83W
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); oJ)v6"j
2)用PreparedStatement来执行sql语句 rZ7)sE5L
String sql; ?anKSGfj
sql = "insert into user (id,name) values (?,?)"; +jz%:D
PreparedStatement ps = cn.prepareStatement(sql); t M{U6k
ps.setInt(1,xxx); -` e`U%n
ps.setString(2,xxx); [$(/H;
... >CPoeIHK
ResultSet rs = ps.executeQuery(); // 查询 Pr^p
^s
int c = ps.executeUpdate(); // 更新 3+#
"4O
p4{3H+y
3、处理执行结果 'O]Ja-
查询语句,返回记录集ResultSet } =^Al;W
更新语句,返回数字,表示该更新影响的记录数 {:d9q
ResultSet的方法 o[CjRQY]P
1、next(),将游标往后移动一行,如果成功返回true;否则返回false I~I$/j]e`
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ]%/a'[
]$96#}7N
4、释放连接 nXF|AeAco
cn.close(); z6Jfu:_N!
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection
H!ISQ8{V
(L6*#!Dt
可滚动、更新的记录集 X~Vr}
1、创建可滚动、更新的Statement $8,/[V
A
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 'P?DZE
该Statement取得的ResultSet就是可滚动的 f Tc,"{
2、创建PreparedStatement时指定参数 H)&pay
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Z8Il3b*)
ResultSet.absolute(9000); T~'9p`IW
批量更新 vdN0YCXG
1、Statement 66~]7w
Statement sm = cn.createStatement(); Dhe ]f#d
sm.addBatch(sql1); -, #LTW<.
sm.addBatch(sql2); z;EnAy {9
... l<mEGKB#
sm.executeBatch() k@= LR
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 P(BV J_n
2、PreparedStatement Z<0+<tt
PreparedStatement ps = cn.preparedStatement(sql); M.R]hI
{ N%&D(_
ps.setXXX(1,xxx); )CC rO
... V2?&3Z)W
ps.addBatch(); xd`!z`X!,s
} !56gJJ-r
ps.executeBatch(); R]{AJ"p
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 2i~qihx5^
\V,;F!*#G
事务的处理 )\TI^%s
1、关闭Connection的自动提交 ku}I;k |
cn.setAutoCommit(false); l6Q75i)eF
2、执行一系列sql语句 #GHLF
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ]xIfgSq
Statement sm ; [#R<Z+c
sm = cn.createStatement(insert into user...); p@7[w@B\c
sm.executeUpdate(); UPkD^D,
sm.close(); .%4{zaB
sm = cn.createStatement("insert into corp...); R'q:Fc
sm.executeUpdate(); ;hLne0|)}
sm.close(); [oQ&}3\XJ
3、提交 j\SW~}d9
cn.commit(); cAE.I$T(
4、如果发生异常,那么回滚 Y)I8(g}0
cn.rollback();