java 数据库基本操作 |JQ05nb
1、java数据库操作基本流程 $<PVzW,$o
2、几个常用的重要技巧: x #g,l2_!
可滚动、更新的记录集 Q5JeL6t
批量更新 2[eY q1f!
事务处理 :{2$X|f
3
x]T;W&s
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 *^ BE1-
1、取得数据库连接 yD"sYT
1)用DriverManager取数据库连接 ^\%%9jY
例子 ^bGi_YC
String className,url,uid,pwd; e#^by(1@}
className = "oracle.jdbc.driver.OracleDriver"; >sq9c/}X
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; XF6=xD
uid = "system"; IK);BN2<L
pwd = "manager"; {]]I4a
Class.forName(className); ~gD]JiiA
Connection cn = DriverManager.getConnection(url,uid,pwd); HY:n{=o
2)用jndi(java的命名和目录服务)方式 9mZ1 a6,x
例子 f[D#QC
String jndi = "jdbc/db"; X)+N>8o?N
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ^xrR3m*d
DataSource ds = (DataSource) ctx.lookup(jndi); &-A7%"
Connection cn = ds.getConnection(); duCm+4,.
多用于jsp中 l?~h_8&fT
2、执行sql语句 6G],t)<A'-
1)用Statement来执行sql语句 Hn)=:lI
String sql; RZjR d
Statement sm = cn.createStatement(); sMK/l @7
sm.executeQuery(sql); // 执行数据查询语句(select) Ql
1# l:Q
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Mv3Ch'X[
2)用PreparedStatement来执行sql语句 r{_'2Z_i
String sql; <[bDNe["?
sql = "insert into user (id,name) values (?,?)"; I\_ R&
v
PreparedStatement ps = cn.prepareStatement(sql); XA68H!I
ps.setInt(1,xxx); YX(%jcj*
ps.setString(2,xxx); W%o){+,
... x4K5
ResultSet rs = ps.executeQuery(); // 查询 FKP^f\!M
int c = ps.executeUpdate(); // 更新 8}"j#tDc
)d~Mag+
3、处理执行结果 5I14"Qf
查询语句,返回记录集ResultSet $.kYAsZts
更新语句,返回数字,表示该更新影响的记录数 gFH_^~7i8p
ResultSet的方法 {ig@Iy~DT
1、next(),将游标往后移动一行,如果成功返回true;否则返回false |j<'[gB\p
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Hw
I s7
I~I%z'"RQd
4、释放连接 F
7=-k/k
cn.close(); dGg+[?
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection s0u$DM2
gqhW.e}]
可滚动、更新的记录集 "?!IPX2\S
1、创建可滚动、更新的Statement b8Qm4 b?:4
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); tj0vB]c
该Statement取得的ResultSet就是可滚动的 6yU~^))bx
2、创建PreparedStatement时指定参数 #LZ`kSlv4
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Jc+U$h4
ResultSet.absolute(9000); 3^\y>
批量更新 <|4j<U
1、Statement {BF\G%v;+
Statement sm = cn.createStatement(); S.z ;Bm
sm.addBatch(sql1); 7)T+!>
sm.addBatch(sql2);
,Xw/
t>
... m`|Z1CT
sm.executeBatch() 1NTe@r!y
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 U7W ct %
2、PreparedStatement 6!$S1z#wM
PreparedStatement ps = cn.preparedStatement(sql); C{D2mSS
{ 4}CRM# W2
ps.setXXX(1,xxx); .&ZVy{uP
... xl3U
ps.addBatch(); !l~hO
} ra3WLK
ps.executeBatch(); 8Xr3q eh+
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 K;95M^C\O*
;u%h wlo
事务的处理 d7&PbITN
1、关闭Connection的自动提交 =P!Vi6[gF~
cn.setAutoCommit(false); -}(W=r\
2、执行一系列sql语句 &Fi8@0Fh
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Um~jp:6p
Statement sm ; M$)+Uo2
sm = cn.createStatement(insert into user...); 5FMKJ7sC9
sm.executeUpdate(); 1ysA~2
sm.close(); -nW{$&5AF
sm = cn.createStatement("insert into corp...); .q=X58tHu
sm.executeUpdate(); mH?hzxa+
sm.close(); `XnFc*L 1
3、提交 }8svd#S+
cn.commit(); ns3k{l#
4、如果发生异常,那么回滚 oTL "]3`'
cn.rollback();