java 数据库基本操作 zJCm0HLJ
1、java数据库操作基本流程 rh%-va9
2、几个常用的重要技巧: PRi3=3oF
可滚动、更新的记录集 H6Qb]H.C
批量更新 ]Y%U5\$
事务处理 ujMics(
xw5LPz;B
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 M!nwcxB!
1、取得数据库连接 leMcY6
1)用DriverManager取数据库连接 Ag#o&Y
例子 MV.$Ay
String className,url,uid,pwd; }?vVJm'
className = "oracle.jdbc.driver.OracleDriver"; ;{e=Iz}/
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; <>9zXbI
uid = "system"; erQ0fW
pwd = "manager"; $hM>%u
Class.forName(className); w\PCBY=
Connection cn = DriverManager.getConnection(url,uid,pwd); O"Ua|8
2)用jndi(java的命名和目录服务)方式 &GetRDr
例子 KE
k]<b=
String jndi = "jdbc/db"; E
02l=M
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); HGJfj*JH
DataSource ds = (DataSource) ctx.lookup(jndi); R:}u(N
Connection cn = ds.getConnection(); f} _d`?K
多用于jsp中 +&:?*(?Q
2、执行sql语句 v!b
8_0~u6
1)用Statement来执行sql语句 :(o6^%x
String sql; i9FtS7
Statement sm = cn.createStatement(); 5PXo1"n8T
sm.executeQuery(sql); // 执行数据查询语句(select) (b}}'
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); =Lyo]8>,X
2)用PreparedStatement来执行sql语句 Nr(3!-
String sql; _/iw=-T
sql = "insert into user (id,name) values (?,?)"; /Wqx@#
PreparedStatement ps = cn.prepareStatement(sql); jj&4Sv#>
ps.setInt(1,xxx); FID4@--
ps.setString(2,xxx); |>2IgTh1a
... zLa3Q\T
ResultSet rs = ps.executeQuery(); // 查询 buv*qPO
int c = ps.executeUpdate(); // 更新 ^twJNm{99
Q'mLwD3>
3、处理执行结果 y_Tc$g~
查询语句,返回记录集ResultSet S5$sB{\R
更新语句,返回数字,表示该更新影响的记录数 `T \"B%
ResultSet的方法 1; "t8.*%e
1、next(),将游标往后移动一行,如果成功返回true;否则返回false %j*i=
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 )f6:{ma
<m|\#Jw_V
4、释放连接 _P]!J~$5
cn.close(); ZJ7<!?6
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection xQetAYP`
49("$!
可滚动、更新的记录集 xWa96U[
1、创建可滚动、更新的Statement ;C+g)BW
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); az=(6PX
该Statement取得的ResultSet就是可滚动的 =b* Is,R/
2、创建PreparedStatement时指定参数 't5 I%F
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); U=G^wL
ResultSet.absolute(9000); x`#|8
批量更新 s.)nS$
1、Statement [v!TQwMU
Statement sm = cn.createStatement(); UOg4E
sm.addBatch(sql1); R1%2]?
sm.addBatch(sql2); S24wv2Uw i
... XazKS4(
sm.executeBatch() i{$h]D_fD
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 =c>w
2、PreparedStatement EpO5_T_
PreparedStatement ps = cn.preparedStatement(sql); { fmY_T[Q8
{ :gNTQZR
ps.setXXX(1,xxx); 4&+;n[ D
... p
FkqDU
ps.addBatch(); rU{E}
} 1YklPMx6
ps.executeBatch(); h]#wwJF
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 0uf'6<f R
<Y(lRM{
事务的处理 zgdOugmmt_
1、关闭Connection的自动提交 +6xEz67A<
cn.setAutoCommit(false); @?w8XHEa|
2、执行一系列sql语句 +P&;cCV`S3
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close c
4<~?L
Statement sm ; CS:mO|
sm = cn.createStatement(insert into user...); |Q'l&Gt6
sm.executeUpdate(); +U%U3tAvs
sm.close(); z'G~b[kG4n
sm = cn.createStatement("insert into corp...); +;}XWV
sm.executeUpdate(); ;!CYp;_
sm.close(); -'tgr6=|w"
3、提交 \?bp^BrI
cn.commit(); 88dq8T4
4、如果发生异常,那么回滚 ?5%|YsJP_
cn.rollback();