java 数据库基本操作 nWHa.H#
1、java数据库操作基本流程 >
%KuNy{
2、几个常用的重要技巧: J4\ qEO
可滚动、更新的记录集 Y3=_ec3w
批量更新 <wAFy>7
事务处理 QNl'ZB\
d \35a4l
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 GDuMY\1
1、取得数据库连接 \W`w` o
1)用DriverManager取数据库连接 fYW6b[lI
例子 %D[0nt|X
String className,url,uid,pwd; 5>TK^1
:
className = "oracle.jdbc.driver.OracleDriver"; \!ej<T+JR>
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ^53r/V }%
uid = "system"; nak Yn
pwd = "manager"; YtWJXkB
Class.forName(className); ~#/hzS
Connection cn = DriverManager.getConnection(url,uid,pwd); C7O6qpO
2)用jndi(java的命名和目录服务)方式 1w&!H]%{
例子 *2X0^H|dS
String jndi = "jdbc/db"; 3=L.uXVb
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Ft!],n-n*
DataSource ds = (DataSource) ctx.lookup(jndi); Tq~=TSD
Connection cn = ds.getConnection(); vz!s~cAt
多用于jsp中 h3;bxq!q
2、执行sql语句 RG4 sQ0
1)用Statement来执行sql语句 /7YF mI/0
String sql; YSe.t_K2C
Statement sm = cn.createStatement(); 9tqF8pb7v
sm.executeQuery(sql); // 执行数据查询语句(select) PV=5UyjW
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Gmz6$^D
2)用PreparedStatement来执行sql语句 ?pzaG{
String sql; 5;{H&O9Q
sql = "insert into user (id,name) values (?,?)"; @n": w2^B
PreparedStatement ps = cn.prepareStatement(sql); "T- `$'9
ps.setInt(1,xxx); X<*U.=r)
ps.setString(2,xxx); Alxx[l\<J
... eD#hpl
ResultSet rs = ps.executeQuery(); // 查询 2TA*m{\Hr
int c = ps.executeUpdate(); // 更新 L5\WpM=
eET}r24
3、处理执行结果 >MvDVPi~+
查询语句,返回记录集ResultSet v 7x:dcV
更新语句,返回数字,表示该更新影响的记录数 N~xLu8,
ResultSet的方法 X'"SVO.
1、next(),将游标往后移动一行,如果成功返回true;否则返回false pLzk
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 }_68j8`
~Onoe $A[<
4、释放连接 z'EajBB\f
cn.close(); v@d
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection :EA\)@^$R
TU
1I} ,
可滚动、更新的记录集 lgtC |kM=
1、创建可滚动、更新的Statement ~((w?Yy"v
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); J":,Vd!*-
该Statement取得的ResultSet就是可滚动的 ,kn">k9
2、创建PreparedStatement时指定参数 'u1?tQ=gmk
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Ez-[
)44/
ResultSet.absolute(9000); 2]ape !(
批量更新 >cCR2j,r
1、Statement go<W( ,O
Statement sm = cn.createStatement(); ..R-Ms)k=
sm.addBatch(sql1); [bk?!0]aV
sm.addBatch(sql2); KFwzy U"
... yu/`h5&*
sm.executeBatch() |1>*;\o-
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 JC3m.)/
2、PreparedStatement .8G@%p{,
PreparedStatement ps = cn.preparedStatement(sql); _Iv6pNd/
{ %$Aqle[
ps.setXXX(1,xxx); heK7pH7;d
... n;T7= 1_"
ps.addBatch(); UZpIcj cL
} <N9[?g)
ps.executeBatch(); 5x>}O3Q_
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 gE?|_x#
?n
ZY)
事务的处理 "
_ka<R..
1、关闭Connection的自动提交 ;hjwD
cn.setAutoCommit(false); CtS l
2、执行一系列sql语句 hBX!iukT|{
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close LmnymcH
Statement sm ; <fFTY130:
sm = cn.createStatement(insert into user...); #hsx#x||
sm.executeUpdate(); E L9]QI
sm.close(); B,=H@[Fj
sm = cn.createStatement("insert into corp...); /x1![$oC0
sm.executeUpdate(); &mtJRfnu
sm.close(); HI11Jl}{
3、提交 =^5Alba/
cn.commit(); KW^7H
4、如果发生异常,那么回滚 y;o^- O
cn.rollback();