java 数据库基本操作 . B9iLI
1、java数据库操作基本流程 Oh`69
k
2、几个常用的重要技巧: &K.d'$q
可滚动、更新的记录集 ]L $\
#
批量更新 3?9IJ5p
事务处理 YeL#jtC
K~{$oD7!
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 o3^l~iT
1、取得数据库连接 `/XY>T}-
1)用DriverManager取数据库连接 :yr+vcD?
例子 e0zq1XcZ
String className,url,uid,pwd; wLH>:yKUU
className = "oracle.jdbc.driver.OracleDriver"; ~O0 $Suv
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; y/{fX(aV
uid = "system"; )3}9K
^jS
pwd = "manager"; ZRB)uA)5=
Class.forName(className); nI-w}NQ
Connection cn = DriverManager.getConnection(url,uid,pwd); H3^},.
2)用jndi(java的命名和目录服务)方式 n8
i] z
例子 , , OW
String jndi = "jdbc/db"; KIf dafRL
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); gMmaK0uhS
DataSource ds = (DataSource) ctx.lookup(jndi); kk@fL
Connection cn = ds.getConnection(); x b~yM%*c
多用于jsp中 cWsNr'MS*
2、执行sql语句 5h-SCB>P
1)用Statement来执行sql语句 Tod&&T'UW
String sql; O)*+="Rg
Statement sm = cn.createStatement(); O!#g<`r{K
sm.executeQuery(sql); // 执行数据查询语句(select) uAJx.>$b
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); NZLxHD]mp
2)用PreparedStatement来执行sql语句 I<mV+ex
String sql; :D6
ON"6
sql = "insert into user (id,name) values (?,?)"; m)t;9J5
PreparedStatement ps = cn.prepareStatement(sql); 2j88<Yh]H
ps.setInt(1,xxx); rk2j#>l$4
ps.setString(2,xxx); 2g-j.TM
... z6=Z\P+
ResultSet rs = ps.executeQuery(); // 查询 Ts[_u@
int c = ps.executeUpdate(); // 更新 kR-SE5`Jk
=JEv,ZGT3
3、处理执行结果 6:[dj*KGmT
查询语句,返回记录集ResultSet VU(v3^1"
更新语句,返回数字,表示该更新影响的记录数 fI}to&qk
ResultSet的方法 {_[N<U:QT&
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 'Ym9;~(@R
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 vXf!G`D
feDlH[$
4、释放连接 t7Iv?5]N
cn.close(); |O|V-f{l
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection |!3DPA(_
4i azNl#
可滚动、更新的记录集 DS(}<HK{
1、创建可滚动、更新的Statement l'-Bu(
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); qFCOUl
该Statement取得的ResultSet就是可滚动的 %9F([K
2、创建PreparedStatement时指定参数 vjGo;+K
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); |O\s|H
ResultSet.absolute(9000); iAEbu&XG
批量更新 +US!YU
1、Statement :Uzm
Statement sm = cn.createStatement(); M#4pE_G
sm.addBatch(sql1); )9{0]u;9
sm.addBatch(sql2); !*dI|k
... d9fC<Tp
sm.executeBatch() XH 4
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 %+W{iu[|
2、PreparedStatement r1`x=r
PreparedStatement ps = cn.preparedStatement(sql); |P
HT694Uz
{ f;o5=)Y
ps.setXXX(1,xxx); eCU:Q
... "Y
=;.:qe
ps.addBatch(); .PIL
+x*]N
} BDW^7[n
ps.executeBatch(); X8a/ `Y,
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 s^G.]%iU
A@!qv#'
事务的处理 45@ I *`
1、关闭Connection的自动提交 n?!">G
cn.setAutoCommit(false); &WuN&As!Z
2、执行一系列sql语句 HSE!x_$
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close +ZaSM~
Statement sm ; ~ ?Qe?hB
sm = cn.createStatement(insert into user...); 9iIhte.
sm.executeUpdate(); Z*]9E^
sm.close(); 8yR.uMI$/
sm = cn.createStatement("insert into corp...); n`?aC|P2s
sm.executeUpdate(); 1y@i}<9F
sm.close(); ;40/yl3r3[
3、提交 Fx_z 6a
cn.commit(); sk<3`x+
4、如果发生异常,那么回滚 |PCm01NU!
cn.rollback();