java 数据库基本操作 bVr*h2p
1、java数据库操作基本流程 f!t69nd%L
2、几个常用的重要技巧: Q}A=jew
可滚动、更新的记录集 aaWJ*
>rJ
批量更新 UFn8kBk
事务处理 3b[jwCt
O$!*%TL
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 !wLg67X$
-
1、取得数据库连接 k /EDc533d
1)用DriverManager取数据库连接 e yw'7
例子 VY 1vXM3y
String className,url,uid,pwd; h7_)%U<J2
className = "oracle.jdbc.driver.OracleDriver"; K_-d(
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; *HM?YhR
uid = "system"; +UWU|:
pwd = "manager"; J#3{S]*v_
Class.forName(className); Ek.&Sf$cd'
Connection cn = DriverManager.getConnection(url,uid,pwd); B`#h{ )[
2)用jndi(java的命名和目录服务)方式 $<)Yyi>6E
例子 ET^ |z
String jndi = "jdbc/db"; _q>SE1j+W=
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); mZ0J!QYk
DataSource ds = (DataSource) ctx.lookup(jndi); pF=g||gS
Connection cn = ds.getConnection(); H ;@!?I
多用于jsp中 K=u0nrG*
2、执行sql语句 m)?5}ZwAH
1)用Statement来执行sql语句 1@sM1WMX
String sql; J_#R 87
Statement sm = cn.createStatement(); #$'"cfRxc
sm.executeQuery(sql); // 执行数据查询语句(select) Xwu.AVsr
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); eQX`,9:5
2)用PreparedStatement来执行sql语句 @y~P&HUN
String sql; eTE2J~\
sql = "insert into user (id,name) values (?,?)"; P]<= ! F
PreparedStatement ps = cn.prepareStatement(sql); Sg*0[a3z
ps.setInt(1,xxx); 0??Yr
ps.setString(2,xxx); 17UK1Jx,
... $. e)
ResultSet rs = ps.executeQuery(); // 查询 uf) Oy7FQ
int c = ps.executeUpdate(); // 更新 GaNq2 G
h%#_~IA:|
3、处理执行结果 4,eQW[;kk
查询语句,返回记录集ResultSet _ptP[SV^j
更新语句,返回数字,表示该更新影响的记录数 E%k7wM {
ResultSet的方法 U
:9=3A2$x
1、next(),将游标往后移动一行,如果成功返回true;否则返回false j=sBq.S
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 )GB`*M[
/-*hjX$n
4、释放连接 \MYU<6{u
cn.close(); DR+,Y2!_GT
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ]YD(`42 x
r)l`
可滚动、更新的记录集 nTnRGf\T
1、创建可滚动、更新的Statement '
lo.h""
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); wgd<3 X
该Statement取得的ResultSet就是可滚动的 _3^y|_!
2、创建PreparedStatement时指定参数 I^0t2[M
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); KXBL
eR&^
ResultSet.absolute(9000); R ZcH+?7
批量更新 'wQy]zm$
1、Statement ]
VG?+
Statement sm = cn.createStatement(); mA{#]Yvf1
sm.addBatch(sql1); =&NOHT>
sm.addBatch(sql2); a>Re^GT+z
... *=nO
sm.executeBatch() 2*[Un(
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 d?Y-;-|8Qh
2、PreparedStatement B%b_/F]e
PreparedStatement ps = cn.preparedStatement(sql); LdTIR]
{ ,?b78_,2
ps.setXXX(1,xxx); V,4.$<e
... N=ifIVc
ps.addBatch(); LDX*<(
} Jh2Wr!5
ps.executeBatch(); #vnT&FN0[
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 {OxWcK\2@h
; h+ q
事务的处理 :0Te4UE;P7
1、关闭Connection的自动提交 U )Zt-og
cn.setAutoCommit(false); ]tVl{" .{
2、执行一系列sql语句 Zq?_dIX
%
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close KRk~w]
Statement sm ; ?V+wjw
sm = cn.createStatement(insert into user...); ,t~sV@ap
sm.executeUpdate(); V/H@vKN2
sm.close(); wc[c N+p
sm = cn.createStatement("insert into corp...); XJFnih
sm.executeUpdate(); E%*AXkJ'dZ
sm.close(); wu^q`!ml
3、提交 6F5,3&
cn.commit(); /?3:X*
4、如果发生异常,那么回滚 k:0P+d
cn.rollback();