java 数据库基本操作 [H;HrwM
s)
1、java数据库操作基本流程 e`zEsLs@
2、几个常用的重要技巧: :' ?%%P
可滚动、更新的记录集 h^^zR)EVb
批量更新 4[a?..X
事务处理 e`k6YO
fL.;-
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 =MDir$1Z
1、取得数据库连接 ]UKKy2r.
1)用DriverManager取数据库连接 jT"P$0sJAd
例子 WXu:mv,'e
String className,url,uid,pwd; Nv "R'Pps
className = "oracle.jdbc.driver.OracleDriver"; *vv<@+gA
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; h=SQ]nV{
uid = "system"; 1MHP#X;|
pwd = "manager"; m6^Ua
Class.forName(className); @*q WV*$h
Connection cn = DriverManager.getConnection(url,uid,pwd); v'Ce|.;
2)用jndi(java的命名和目录服务)方式 *F* c
例子 D5fJuT-bp
String jndi = "jdbc/db"; W/ZmG]sZE
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); H=])o21
DataSource ds = (DataSource) ctx.lookup(jndi); !R;P"%PHV
Connection cn = ds.getConnection(); '#$Y:/
多用于jsp中 C\Q3vG
2、执行sql语句 jcHs!
1)用Statement来执行sql语句 u':-DgK
String sql; <HM\ZDo@P
Statement sm = cn.createStatement(); +jYO?uaT
sm.executeQuery(sql); // 执行数据查询语句(select) _Z+tb]
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); pw{3I 2Ix
2)用PreparedStatement来执行sql语句 _F>1b16:/P
String sql; #\N?ka}!
sql = "insert into user (id,name) values (?,?)"; 'ah|cMRn
PreparedStatement ps = cn.prepareStatement(sql); H
.)}|
ps.setInt(1,xxx); EQ`;=I3J9y
ps.setString(2,xxx); kf\n
... wVkms
ResultSet rs = ps.executeQuery(); // 查询 IK5FSN]s/
int c = ps.executeUpdate(); // 更新 L,!?'.*/]
# m?GBr%k
3、处理执行结果 "6_#APoP
查询语句,返回记录集ResultSet fgg^B[(Y
更新语句,返回数字,表示该更新影响的记录数 `M/=_O3
ResultSet的方法 yLCqlK
1、next(),将游标往后移动一行,如果成功返回true;否则返回false zy`4]w$Lj+
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 fv$Y&_,5
cnvxTI<
4、释放连接 *zeY<6
cn.close(); {dvrj<?
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection p 7IJ3YY
loN!&YceW
可滚动、更新的记录集 (1JZuR<?c
1、创建可滚动、更新的Statement 3lH#+@
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 7vUfA"
该Statement取得的ResultSet就是可滚动的 c_clpMx=
2、创建PreparedStatement时指定参数 v'i"Q
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); LqIMU4Ex
ResultSet.absolute(9000); J0zudbP
批量更新 o_&.R
1、Statement |t CD@M
Statement sm = cn.createStatement(); MV6%~T
sm.addBatch(sql1); 6-va;G9Fc
sm.addBatch(sql2); h h}%Z=
... /]%,C
sm.executeBatch() u^a\02aV[
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ya5a7
2、PreparedStatement #3u3WTk+
PreparedStatement ps = cn.preparedStatement(sql); & tQHxiDX
{ oc'#sE
ps.setXXX(1,xxx); 2!f0!<te
... FQNhn+A
ps.addBatch(); zMs]9o
} 7Z5,(dH>
ps.executeBatch(); 'D%No!+Py
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 !VpZo*+
^y'xcq
事务的处理 ^ L'8:
1、关闭Connection的自动提交 K+2bNKZ0
cn.setAutoCommit(false); C0/s/p'
2、执行一系列sql语句 (bt^L3}a
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 5&7)hMppI
Statement sm ; Q>7#</i\.
sm = cn.createStatement(insert into user...); $de_>
sm.executeUpdate(); (Tp+43v
sm.close(); 8=gr F
sm = cn.createStatement("insert into corp...); :Q2\3
sm.executeUpdate(); 8~RUYsg
sm.close(); Dntcv|%u
3、提交 $D5[12X
cn.commit(); +JZ<9,4
4、如果发生异常,那么回滚 G?\o_)IJ
cn.rollback();