java 数据库基本操作 Kr'5iFK7
1、java数据库操作基本流程 =h9&`iwiu
2、几个常用的重要技巧: |/-H:\5
可滚动、更新的记录集 %$L!N-U6
批量更新 }_L,Xg:I
事务处理 7R`:^}'>
z<c@<M=Q*
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ]%VR Nm
1、取得数据库连接 eE/E#W8
1)用DriverManager取数据库连接 <Sx-Ca7
例子 +WYXj
String className,url,uid,pwd; kG>d^K
className = "oracle.jdbc.driver.OracleDriver"; 0R%R2p'wG
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Wq1%
uid = "system"; hWujio/h
pwd = "manager"; >F~]r$G
Class.forName(className); 'X$2gD3c9
Connection cn = DriverManager.getConnection(url,uid,pwd); P~y%
2)用jndi(java的命名和目录服务)方式 Z;bg;@r|
例子 +84JvOkWi
String jndi = "jdbc/db"; Z&!5'_9{V
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ah\yw
DataSource ds = (DataSource) ctx.lookup(jndi); X>`e(1`_O
Connection cn = ds.getConnection(); ?UlAwxn
多用于jsp中 MwN.Ll
2、执行sql语句 7]w]i5
1)用Statement来执行sql语句 I8C(z1(N
String sql; ;LM,<QJ
Statement sm = cn.createStatement(); -_@3!X1~i+
sm.executeQuery(sql); // 执行数据查询语句(select) o0Y
{k8
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); spE(s%dgL
2)用PreparedStatement来执行sql语句 {uQp$`
String sql; b3z{FP
sql = "insert into user (id,name) values (?,?)"; $-zt,iRyV
PreparedStatement ps = cn.prepareStatement(sql); G:HPd.ay
ps.setInt(1,xxx); qd=&*?
ps.setString(2,xxx); E{m\LUd^
:
... ',o ,o%n
ResultSet rs = ps.executeQuery(); // 查询 3(De> gs$
int c = ps.executeUpdate(); // 更新 +O 2H":$
tp-PE?
3、处理执行结果 Z9MT,
"
查询语句,返回记录集ResultSet brk>oM;t
更新语句,返回数字,表示该更新影响的记录数 [/B$cH
ResultSet的方法 l0^~0xlED
1、next(),将游标往后移动一行,如果成功返回true;否则返回false =@F1J7
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 "w#jC~J<W
^{3,ok*Nf
4、释放连接 y6bl&_
cn.close(); ~|_s2T
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection &R\t<X9 n
dD
Qx[
可滚动、更新的记录集 SLyeonM-C
1、创建可滚动、更新的Statement }0&@J'<
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 5E|y5|8fb
该Statement取得的ResultSet就是可滚动的 dWhki|c
2、创建PreparedStatement时指定参数 Dp)5u@I
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
}pOem}
ResultSet.absolute(9000); \>b
:
批量更新 9ZbT41
1、Statement .DzFtc
Statement sm = cn.createStatement(); z?NMQ8l|:6
sm.addBatch(sql1); ~(( '1+
sm.addBatch(sql2); O_yk<
... a^U)2{A*f
sm.executeBatch() Y7TW_[_u
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Z2HH&3HA
2、PreparedStatement [8F1rZ&
PreparedStatement ps = cn.preparedStatement(sql); ^Jv$Wx
{ 8|5ttdZ
ps.setXXX(1,xxx); Y8c#"vm(
... 1{TmK9U
ps.addBatch(); 8F?6Aq1B
} ; L<D-=
ps.executeBatch(); ,4O|{Iu#n
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ZtS>'W8l
4<j)1i=A
事务的处理 I?2S{]!?
1、关闭Connection的自动提交 /I`AwCx
cn.setAutoCommit(false); M0+xl+c+
2、执行一系列sql语句 us/}_r74N*
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close P2U^%_~
Statement sm ; %\i
OX|F_
sm = cn.createStatement(insert into user...); 2P`Z>_
sm.executeUpdate(); V 6DWYs>
sm.close(); Pv- i.
sm = cn.createStatement("insert into corp...); ,~z*V;y)
sm.executeUpdate(); O[$,e%
sm.close(); <_o).hE{
3、提交 oGtz*AP%
cn.commit(); 25NTtj:X
4、如果发生异常,那么回滚 6cO36
cn.rollback();