java 数据库基本操作 " TCJT390
1、java数据库操作基本流程 x_O:IK.>
2、几个常用的重要技巧: #7 H0I8
可滚动、更新的记录集 /Zs_G=\>
批量更新 H5d@TB,`
事务处理 XPrnQJ
q<.k:v&
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 nt_Cb*K<
1、取得数据库连接 ~1TT ?H
1)用DriverManager取数据库连接 5+{oQs_
例子 gcwJ{&
String className,url,uid,pwd; -}xK>
["
className = "oracle.jdbc.driver.OracleDriver"; GBZ u<t/
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; JO]?u(m01
uid = "system"; z{BgAI,
pwd = "manager"; V&j]*)
Class.forName(className); IX
6 jb"
Connection cn = DriverManager.getConnection(url,uid,pwd); p) ;[;S
2)用jndi(java的命名和目录服务)方式 21<Sfsc$
例子 @ukL!AV?Y
String jndi = "jdbc/db"; ;L76V$&
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); kn$SG
DataSource ds = (DataSource) ctx.lookup(jndi); GZ5 DI+3
Connection cn = ds.getConnection(); mK7SEH;
多用于jsp中 pdN8hJ
2、执行sql语句 TG?>;It&
1)用Statement来执行sql语句 D?xR>Oo)
String sql; 3&[ d.,/
Statement sm = cn.createStatement(); XpKeN2=p
sm.executeQuery(sql); // 执行数据查询语句(select) YJwI@E(l$
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); VtN@B*
2)用PreparedStatement来执行sql语句 |w~*p
N0
String sql; b~ig$!N]
sql = "insert into user (id,name) values (?,?)"; ~.e~YI80
PreparedStatement ps = cn.prepareStatement(sql); 0"\js:-$
ps.setInt(1,xxx); Tsu\4
cL]
ps.setString(2,xxx); asvM/ 9
... P"Q6 wdm
ResultSet rs = ps.executeQuery(); // 查询 aY,'^S
int c = ps.executeUpdate(); // 更新 BUI#y `J
BUL<FTg
3、处理执行结果 btC<>(kl&
查询语句,返回记录集ResultSet #Ph8?
更新语句,返回数字,表示该更新影响的记录数 hE,-CIRg
ResultSet的方法 um".Z4S
1、next(),将游标往后移动一行,如果成功返回true;否则返回false r<dvo%I#|
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Lrt~Q:z2u
h|z59h&X8G
4、释放连接 /_(l:q^
cn.close(); B.Z5+MgM
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ? R[GSS1
.`D$.|!8g
可滚动、更新的记录集 5}9rpN{y
1、创建可滚动、更新的Statement S[/D._5QD%
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); N4yQ,tG>aa
该Statement取得的ResultSet就是可滚动的 ]xV2=!J
2、创建PreparedStatement时指定参数 >Zm|R|{BE
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ZQ\O|
n8
ResultSet.absolute(9000); *$t =Lh
批量更新 J
rYL8 1
1、Statement ^!(tc=sr
Statement sm = cn.createStatement(); i#U_g:~wC
sm.addBatch(sql1); .'1]2/ad
sm.addBatch(sql2); sPX~>8}|VP
... 2+YM .Zl
sm.executeBatch() B]#iZ,Tp
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Hg(nC*#/Q
2、PreparedStatement kkT=g^D9j
PreparedStatement ps = cn.preparedStatement(sql); 6se[>'5
{ 7c'OIY].,
ps.setXXX(1,xxx); >hotkMX `3
... j{%'A
ps.addBatch(); 2+\@0j[q
} 0)|;uW
ps.executeBatch(); }Mc&yjhMrg
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 h4>q~&Pd
a/q8v P
事务的处理 a&n}pnEn)
1、关闭Connection的自动提交 VsRdZ4
cn.setAutoCommit(false); "SwM%j
2、执行一系列sql语句 d+7Dy3i|g=
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close n]_<6{: U
Statement sm ; &,=t2_n
sm = cn.createStatement(insert into user...);
{0} Q5
sm.executeUpdate(); z
2Ao6*%
sm.close(); yuB\Z/
sm = cn.createStatement("insert into corp...); ='.G,aJ9
sm.executeUpdate(); ==W] 1@s
sm.close(); 0\Myhh~DLE
3、提交 PKNpR
cn.commit(); p~t5PU*(
4、如果发生异常,那么回滚 F!6;<!&