java 数据库基本操作 iQS,@6
1、java数据库操作基本流程 jU* D
2、几个常用的重要技巧: 3zu6#3^
可滚动、更新的记录集 EW1,&H
批量更新 /'5d0' ,M
事务处理 ^9]iUx
&GkD5b
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 C ocw%Yl
1、取得数据库连接 +cSc0:
1)用DriverManager取数据库连接 -
jCj_@n
例子 wc.=`Me
String className,url,uid,pwd; fGqX
dlP
className = "oracle.jdbc.driver.OracleDriver"; z;F HZb9t,
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; H%gAgXHn
uid = "system"; k!}(a0h
pwd = "manager"; bX,#z,
Class.forName(className); .a7RGT3]m
Connection cn = DriverManager.getConnection(url,uid,pwd); 3ce$eZE
2)用jndi(java的命名和目录服务)方式 _U-`/r o
例子 7 4MxU
String jndi = "jdbc/db"; !|UX4
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); K3M.ZRh\;`
DataSource ds = (DataSource) ctx.lookup(jndi); cz{`'VN}`
Connection cn = ds.getConnection(); #QIY+muN
多用于jsp中 =y _KL
2、执行sql语句 nc\`y,>l8
1)用Statement来执行sql语句
Dmr*Lh~
String sql; ENIg_s4
Statement sm = cn.createStatement(); _#NibW
sm.executeQuery(sql); // 执行数据查询语句(select) jC4>%!{m
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); u}|v;:|j
2)用PreparedStatement来执行sql语句 B^r?N-Z A
String sql; v_Sa0}K9
sql = "insert into user (id,name) values (?,?)"; {H)hoAenA
PreparedStatement ps = cn.prepareStatement(sql); !'p<Kh[i
ps.setInt(1,xxx); |Z{#DOT
ps.setString(2,xxx); KFwuz()7
... Wc2&3p9 c
ResultSet rs = ps.executeQuery(); // 查询 -grmmE]/
int c = ps.executeUpdate(); // 更新 HI 1T
'jfE?ngt
3、处理执行结果 D
5n\h5
查询语句,返回记录集ResultSet (${ #l
更新语句,返回数字,表示该更新影响的记录数 nJ]7vj,rB
ResultSet的方法 _.Hj:nFHz
1、next(),将游标往后移动一行,如果成功返回true;否则返回false
Um{) ?1
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 }P0bNY5?%
-^2p@^
4、释放连接 L"vrX
cn.close(); +]A,fmI.
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ,v
K%e>e&
">CRFee0
可滚动、更新的记录集 m~AAO{\:b
1、创建可滚动、更新的Statement jVd`J
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ; _c&J&I
该Statement取得的ResultSet就是可滚动的 z+7V}aPM
2、创建PreparedStatement时指定参数 c-(RjQ~M5
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); g;'S5w9S
ResultSet.absolute(9000); |ugdl|f
批量更新 h~\k;ca
1、Statement ?.Vuet
Statement sm = cn.createStatement(); `e<IO_cg
sm.addBatch(sql1); !DFTg4xb
sm.addBatch(sql2); rIPfO'T?
... ,HTwEq>-G
sm.executeBatch() YiO}"
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 7>y]uT@ar
2、PreparedStatement @3KSoA"^
PreparedStatement ps = cn.preparedStatement(sql); W,6q1
{
94PI
ps.setXXX(1,xxx); 9!n95
... 81x/bx@L%
ps.addBatch(); O=7S=Rm4&
} F\xIVY
ps.executeBatch(); $I*}AUp
v?
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 jyW={%&
'RKpMdoz
事务的处理 yZ,pH1
1、关闭Connection的自动提交 !9PAfi?
cn.setAutoCommit(false); ]NTQF/
2、执行一系列sql语句 <M1*gz
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close %<nGm\
Statement sm ; S?JCi=
sm = cn.createStatement(insert into user...); 1?H;
c5?d&
sm.executeUpdate(); #~-Xt!I
sm.close(); |Jd8ul:&e
sm = cn.createStatement("insert into corp...); /!5ohQlPJ
sm.executeUpdate(); ,\"x#Cc f
sm.close(); ?%~p@
3、提交 ^UKY1Q.
cn.commit(); f\=
@jV
4、如果发生异常,那么回滚 e8 ]CB
cn.rollback();