java 数据库基本操作 wxU@M1w}
1、java数据库操作基本流程 BU],,t\
2、几个常用的重要技巧: 1\K%^<QY
可滚动、更新的记录集 ] }XsP
批量更新 y5gTd_-
事务处理 ^ur?da9z'
<WhdQKFf-
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 .BP@1K
1、取得数据库连接 FY1
>{Bn
1)用DriverManager取数据库连接 9cQZ`Ex
例子 5'=\$Ob
String className,url,uid,pwd; },<(VhP
className = "oracle.jdbc.driver.OracleDriver"; %X)w$}WH
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Q'D%?Vg'
uid = "system"; 6jz6
pwd = "manager"; KG7 ~)g
Class.forName(className); +ve S~
Connection cn = DriverManager.getConnection(url,uid,pwd); oZm)@Vv;
2)用jndi(java的命名和目录服务)方式 \>,[5|GU
例子 &p|+K
XIf
String jndi = "jdbc/db"; tP/0_^m
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); K@yLcgr{O2
DataSource ds = (DataSource) ctx.lookup(jndi); *l\wl @{
Connection cn = ds.getConnection(); OI:G~Wg
多用于jsp中 ypyqf55gK
2、执行sql语句 N 0<([B;
1)用Statement来执行sql语句 &5k$v^W5
String sql; +ZOjbI)
Statement sm = cn.createStatement(); tbMf_-g
sm.executeQuery(sql); // 执行数据查询语句(select) 5qZebD2a
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); zl8O @g
2)用PreparedStatement来执行sql语句 n$]78\C
String sql; 2Iv&XxSo
sql = "insert into user (id,name) values (?,?)"; S~L;oX?(!
PreparedStatement ps = cn.prepareStatement(sql); v__n>*x
ps.setInt(1,xxx); iF0x>pvJ@
ps.setString(2,xxx); X+6`]]
... `b.KMOn
ResultSet rs = ps.executeQuery(); // 查询 ZbBz@1O
int c = ps.executeUpdate(); // 更新 cP8g.+
SLI(;, s
3、处理执行结果 /Mq9~oC
查询语句,返回记录集ResultSet .T;:6/??1
更新语句,返回数字,表示该更新影响的记录数 $#2zxpr,
ResultSet的方法 o_=t9\:
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ^!a4!DGVT
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 2;&K*>g&.
B<^yT@Wc
4、释放连接 Gs`[\<;LI
cn.close(); ",&^ f
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection d'p]F~a
Z9S5rPHEL
可滚动、更新的记录集 e'"2yA8dh"
1、创建可滚动、更新的Statement v/ $~ifY"
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ,_+Gb
该Statement取得的ResultSet就是可滚动的 gl.uDO%.
2、创建PreparedStatement时指定参数 (^),G-]
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); S(*u_
ResultSet.absolute(9000); ')G,+d^
批量更新 b3j?@31AD
1、Statement $qndG,([F
Statement sm = cn.createStatement(); 04o>POR
sm.addBatch(sql1); K14FY2"
sm.addBatch(sql2); jg)+]r/hS
... 3:H[S_q
sm.executeBatch() Mk=M)d`
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 r1pj-
2、PreparedStatement {Sl#z}@s
PreparedStatement ps = cn.preparedStatement(sql); w^BF.Nu
{ ML:Zm~A1U
ps.setXXX(1,xxx); Ufw_GYxan
... Z|t`}lK
ps.addBatch(); ([g[\c,H
} Sm7O%V8{p
ps.executeBatch(); E}qW'
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 d1[;~)
U!y GZEU"[
事务的处理 ;,WI_iP(w
1、关闭Connection的自动提交 O%Hc%EfG
cn.setAutoCommit(false); MP
LgE.n
2、执行一系列sql语句 ?**9hu\BG
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Jam&Rj,
Statement sm ; ^Kbq.4
sm = cn.createStatement(insert into user...); GMv.G
sm.executeUpdate(); ?b,4mDptE
sm.close(); #aHJ|[[(n
sm = cn.createStatement("insert into corp...); Xh5&J9pw
sm.executeUpdate(); iNO}</7?
sm.close(); )G+D6s23
3、提交 dQ.:xu}~
cn.commit(); (=\))t8J
4、如果发生异常,那么回滚 %tK^&rw%
cn.rollback();