java 数据库基本操作 iE=P'"I
1、java数据库操作基本流程 7
v~ro
2、几个常用的重要技巧: 0E1=W6UZ
可滚动、更新的记录集 !)nD xM`p
批量更新 /BT1oWi1y
事务处理 pqH4w(;
5uttv:@=
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 H]]c9`ayt
1、取得数据库连接 fnWsm4
1)用DriverManager取数据库连接 Y&g&n o_
例子 y1#O%=g
String className,url,uid,pwd; `s%QeAde
className = "oracle.jdbc.driver.OracleDriver"; vd(dNu&,<
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; lV)G@l[1
uid = "system"; ?@DNsVwb
pwd = "manager"; FT(iX`YQ
Class.forName(className); q#'VJA:A5&
Connection cn = DriverManager.getConnection(url,uid,pwd); '?8Tx&}U8
2)用jndi(java的命名和目录服务)方式 N+J>7_k
例子 vhpvO>Q
String jndi = "jdbc/db"; 8YKQItK
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ;'^, ,{
DataSource ds = (DataSource) ctx.lookup(jndi); i.M2E$b|
Connection cn = ds.getConnection(); yl/a:Q
多用于jsp中 ^j=bObaX
2、执行sql语句 #w*"qn#2Uz
1)用Statement来执行sql语句 ?:/|d\,7@
String sql; mW +tV1XjG
Statement sm = cn.createStatement(); 'evv,Q{87
sm.executeQuery(sql); // 执行数据查询语句(select) Uouq>N
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); sOz sY7z3Z
2)用PreparedStatement来执行sql语句 L/fRF"V
String sql; W>/UBN3
sql = "insert into user (id,name) values (?,?)"; 3Oiy)f@{TF
PreparedStatement ps = cn.prepareStatement(sql); H`el#tt_
ps.setInt(1,xxx); (tKMBxQo8
ps.setString(2,xxx); |!}wF}iLc)
... Up|f=@=
ResultSet rs = ps.executeQuery(); // 查询 ^mf jn-=3
int c = ps.executeUpdate(); // 更新 `)tA
YH
#KE;=$(S
3、处理执行结果 bjzx!OCpV
查询语句,返回记录集ResultSet qd8pF!u|#
更新语句,返回数字,表示该更新影响的记录数 LwQH6 !;[
ResultSet的方法 |[LE9Lq/
1、next(),将游标往后移动一行,如果成功返回true;否则返回false N"1QX6
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ]EN&S Wh
uA%Ts*aN
4、释放连接 ._,trb>o
cn.close(); ~6HDW
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection -l[jEJS}
+>#e=nH
可滚动、更新的记录集 Nv3tt
1、创建可滚动、更新的Statement zo44^=~%
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); R@n5AN(
该Statement取得的ResultSet就是可滚动的 DxfMqH[vs
2、创建PreparedStatement时指定参数 > UWStzH<
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); j)";:v
ResultSet.absolute(9000); *8UYS A~v
批量更新 e1uMR-Q
1、Statement c/'M#h)"
Statement sm = cn.createStatement(); !g2a|g
sm.addBatch(sql1); O9e.=l
sm.addBatch(sql2); Spo+@G
... #_fY4vEO
sm.executeBatch() OZT^\Ky_l
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 m^A]+G#/
2、PreparedStatement i~8DSshA
PreparedStatement ps = cn.preparedStatement(sql); xlw 2g<s
{ r=$gT@
ps.setXXX(1,xxx); "kr,x3
=
... (3O1?n[n
ps.addBatch(); 7E\gxQ(vU
} :H\&2/j
ps.executeBatch(); yQwVQUW8B
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 f~*K {7
$?$9y^\
事务的处理 +5-fk>o
1、关闭Connection的自动提交 n ,1tD
cn.setAutoCommit(false); {82rne`[
2、执行一系列sql语句 e?=elN
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Rf:<-C0T
Statement sm ; 6RP+4c
sm = cn.createStatement(insert into user...); b^Z$hnh]S
sm.executeUpdate(); |*E"G5WZM
sm.close(); pyF5S,c
sm = cn.createStatement("insert into corp...); G4m4k
sm.executeUpdate(); s|gp
sm.close(); :d({dF_k;p
3、提交 MHl^/e@
cn.commit(); 6ZOAmH fs
4、如果发生异常,那么回滚 J[r^T&o
cn.rollback();