java 数据库基本操作 kHkpx52
1、java数据库操作基本流程 y6@0O%TDN
2、几个常用的重要技巧: Q0$8j-1I
可滚动、更新的记录集 T`/AY?#
批量更新 sI43@[
事务处理 OBgkpx*Q
6T>mW#E&
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 he#J|p
1、取得数据库连接 H12Fw'2
1)用DriverManager取数据库连接 h-g+g#*
例子 2^XGGB0
String className,url,uid,pwd;
7;u
e
className = "oracle.jdbc.driver.OracleDriver"; 4)E_0.C
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; #w;v0&p
uid = "system"; 9*$t!r{B@
pwd = "manager"; +U:$(UV'A
Class.forName(className); z^KJ*E
Connection cn = DriverManager.getConnection(url,uid,pwd); $JS L-NkE
2)用jndi(java的命名和目录服务)方式 w;D+y*2
例子 FK6[>(QO
String jndi = "jdbc/db"; PEN\-*Pv
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); bf0+DvIB
DataSource ds = (DataSource) ctx.lookup(jndi); )Z[ft
Connection cn = ds.getConnection(); w^(<N7B3T
多用于jsp中 ml2_
]3j!
2、执行sql语句 =Xm@YVf&ZD
1)用Statement来执行sql语句 (As#^q\>B
String sql; k[0-CB
Statement sm = cn.createStatement(); R|JC1f8P5
sm.executeQuery(sql); // 执行数据查询语句(select) `id9j
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); nv ca."5 y
2)用PreparedStatement来执行sql语句 ?m![Pg%
String sql; PxF<\pu&
sql = "insert into user (id,name) values (?,?)"; >AC]#'
PreparedStatement ps = cn.prepareStatement(sql); "X2 Vrn'
ps.setInt(1,xxx); -\+s#kE:
ps.setString(2,xxx); .ELGWF`>
... UsgK
ResultSet rs = ps.executeQuery(); // 查询 c _\YBe]wJ
int c = ps.executeUpdate(); // 更新 ;V@WtZv
%lL.[8r|
3、处理执行结果 ;sfb 4x4
查询语句,返回记录集ResultSet Ok{*fa.PK
更新语句,返回数字,表示该更新影响的记录数 7ByTnYe~S
ResultSet的方法 (
Wa
1、next(),将游标往后移动一行,如果成功返回true;否则返回false oV)~@0B&0
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 avjpA?Vz
0WT{,/>
4、释放连接 hhb?6]Z/
cn.close(); #btLa\HJ
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 0fc/wfv<
0?sRDYaX;c
可滚动、更新的记录集 nJbtS#`G4
1、创建可滚动、更新的Statement |]QqXE-7
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Mc#*wEo)8
该Statement取得的ResultSet就是可滚动的 ekI2icD
2、创建PreparedStatement时指定参数 A2^\q>_#
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); jATI&oX
ResultSet.absolute(9000); cbeLu'DWB.
批量更新 S2n39 3
1、Statement yPM3a7-Bm
Statement sm = cn.createStatement(); za#s/b$[
sm.addBatch(sql1); "mX\&%i6\p
sm.addBatch(sql2); ~SQ?BoCI[
... %509\;el
sm.executeBatch() V7#Ff i
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 vesJEaw7
2、PreparedStatement L{:9Cx!F
PreparedStatement ps = cn.preparedStatement(sql); Tskq)NU
{ Pa(^}n|
ps.setXXX(1,xxx); `IOs-%s
... "@evXql3`
ps.addBatch(); MzPzqm<
} hbU+Usx
ps.executeBatch(); -yR.<KnL
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 |\_^B
;g6M%;1-
事务的处理 *eIJwXE
1、关闭Connection的自动提交 =PUt&`1.a
cn.setAutoCommit(false); jlp:lX
2、执行一系列sql语句 +${D
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close V I,ACj
Statement sm ; 6}75iIKi
sm = cn.createStatement(insert into user...); >*@y8u*
sm.executeUpdate(); 9V,!R{kO!
sm.close(); :*t"8;O[
sm = cn.createStatement("insert into corp...); =81@o,1w
sm.executeUpdate(); R E}?5XHb
sm.close(); :
m)
3、提交 1?)Xp|O
cn.commit(); bB
}$'
4、如果发生异常,那么回滚 'sLiu8G
cn.rollback();