java 数据库基本操作 v#6.VUAw
1、java数据库操作基本流程 "YBA$ef$
2、几个常用的重要技巧: _C4^J
可滚动、更新的记录集 IO+z:D{
批量更新 U;31}'b
事务处理 M$)+Uo2
~^eAS;
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Wwz>tE
1、取得数据库连接 PIA&s6U
1)用DriverManager取数据库连接 N P"z
例子 ;#
{x_>M
String className,url,uid,pwd; (7IF5g\
className = "oracle.jdbc.driver.OracleDriver"; LCG<
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; _YY)-H
uid = "system"; }LRAe3N%8
pwd = "manager"; I4*N
Class.forName(className); kB
2bT}
Connection cn = DriverManager.getConnection(url,uid,pwd); sw&Qks?V
2)用jndi(java的命名和目录服务)方式 .cb mCFXL
例子 Zj JD@,j
String jndi = "jdbc/db"; zt8ZJlNK
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); C"sa.#}
DataSource ds = (DataSource) ctx.lookup(jndi); %guot~S|
Connection cn = ds.getConnection(); YP7<j*s8
多用于jsp中 z7CYYU?
2、执行sql语句 #wo_
1)用Statement来执行sql语句 4eKJ\Q=nX5
String sql; M]W4S4&Y=
Statement sm = cn.createStatement(); YcI]_[
sm.executeQuery(sql); // 执行数据查询语句(select) 5Ql6?UHD
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ]Cj&C/(
2)用PreparedStatement来执行sql语句
4@5<B
String sql; X>CYKRtb
sql = "insert into user (id,name) values (?,?)"; DFiexOb
PreparedStatement ps = cn.prepareStatement(sql); 5u&jNU5m_
ps.setInt(1,xxx); L]VK9qB
ps.setString(2,xxx); }N[sydL
... )*uI/E
ResultSet rs = ps.executeQuery(); // 查询 bIH2cJ
int c = ps.executeUpdate(); // 更新 1{wy%|H\
ex['{|a{
3、处理执行结果 kSDV#8uZ
查询语句,返回记录集ResultSet `XD$1>
更新语句,返回数字,表示该更新影响的记录数 q<1@ut
ResultSet的方法 K,R Ia0)
1、next(),将游标往后移动一行,如果成功返回true;否则返回false QhZ%<zN
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 #8`G&S*
CI,-qi
4、释放连接 V;z?m)ur
cn.close(); QK72F
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection
A=,m
YP6+o#==
可滚动、更新的记录集 ugCc&~`
1、创建可滚动、更新的Statement ovHbs^H%
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); !xlVyt5e
该Statement取得的ResultSet就是可滚动的 bUBuJ
2、创建PreparedStatement时指定参数 ^,X+
n5q;m
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); HCP Be2
ResultSet.absolute(9000); /i]Gg
\)
批量更新 eI[z%j[Y*
1、Statement NZ_45/(dx
Statement sm = cn.createStatement(); 4M:oa#gh@
sm.addBatch(sql1); a}fW3+>
sm.addBatch(sql2); [;2v[&Po
... u66w('2
sm.executeBatch() Cr&ua|%F
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 h m"B kOA
2、PreparedStatement 464Z0C
PreparedStatement ps = cn.preparedStatement(sql); n_!&Wr^CX
{ UKzmRa,s
ps.setXXX(1,xxx); &@RU}DnvM&
... # WxH
ps.addBatch(); c(~M<nL0
} 5E%W;$3Pb
ps.executeBatch(); HiWZ?G
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 :\>UZ9h #
o;O_N^_W
事务的处理 9uq|
VU5
1、关闭Connection的自动提交 A_g'9
cn.setAutoCommit(false); 3w-0v"j U
2、执行一系列sql语句 mF_/Rhu
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close $q+7,,"
Statement sm ; snK/,lm.
sm = cn.createStatement(insert into user...); PCES&|*rf
sm.executeUpdate(); \&cVcAg
sm.close(); S`-z$ph}
sm = cn.createStatement("insert into corp...); Wbc %G8
sm.executeUpdate(); mX#T<_=d
sm.close(); -AbA6_j
3、提交 6q5V*sJ&
cn.commit(); Z?b.
PC/
4、如果发生异常,那么回滚 ~E)I+$,
cn.rollback();