java 数据库基本操作 G>=9gSLM
1、java数据库操作基本流程 iJ`%yg,
2、几个常用的重要技巧: 5w,lw
可滚动、更新的记录集 *or2
批量更新 NIGB[2V(
事务处理 L876$
$ ]W[y=
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 LsJs Q
h
1、取得数据库连接 yN 9$gfJC^
1)用DriverManager取数据库连接 <OR.q
例子 `W"a!,s2
String className,url,uid,pwd; K2x6R
className = "oracle.jdbc.driver.OracleDriver"; J.bFv/R
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 0<]$v"`I
uid = "system"; 7m|`tjQ1
pwd = "manager"; @4/~~
Class.forName(className); zj~nnfoys
Connection cn = DriverManager.getConnection(url,uid,pwd); io9y;S"+
2)用jndi(java的命名和目录服务)方式 !paN`Fz\a
例子 .N5hV3
String jndi = "jdbc/db"; i"%JFj_G
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); uQ[vgNe*m
DataSource ds = (DataSource) ctx.lookup(jndi); ,zAK3d&hj
Connection cn = ds.getConnection(); i7S>RB
多用于jsp中 .)iO Du
2、执行sql语句 f$1Gu
1)用Statement来执行sql语句 CN\|_y
String sql; K/f>f; c
Statement sm = cn.createStatement(); }mKGuCoH>
sm.executeQuery(sql); // 执行数据查询语句(select) 22)0zY%\
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); D'7A2 f
2)用PreparedStatement来执行sql语句 qhV,u;\.
String sql; <X:Ud&\
sql = "insert into user (id,name) values (?,?)"; 6WA|'|}=
PreparedStatement ps = cn.prepareStatement(sql); 1.Haf
ps.setInt(1,xxx); t{/:( Nu
ps.setString(2,xxx); B;xZ%M]
... iEiu%T>
ResultSet rs = ps.executeQuery(); // 查询 aL8p"iSG9
int c = ps.executeUpdate(); // 更新 zyaW3th
bK?1MiXb
3、处理执行结果 Y
brx%
查询语句,返回记录集ResultSet 1YJ_1VJ
更新语句,返回数字,表示该更新影响的记录数 GXT]K>LA
ResultSet的方法 u
iBl#J Q
1、next(),将游标往后移动一行,如果成功返回true;否则返回false |7svA<<[
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 BCBEX&0hk{
\ V[;t-
4、释放连接 t2=a(N-/,
cn.close(); p&i.)/
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection J"%8:pL
%==G+S{
可滚动、更新的记录集 TA Ftcs:
1、创建可滚动、更新的Statement ~gu=x&{
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); I*^5'N'
该Statement取得的ResultSet就是可滚动的 siZr@g !L
2、创建PreparedStatement时指定参数 C-Nuy1o
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); SV$nyV
ResultSet.absolute(9000); TRF]i/Bs
批量更新 fA"<MslKLK
1、Statement -h>Z,-DE6
Statement sm = cn.createStatement(); Qo'yS"g<9)
sm.addBatch(sql1); ! G*&4V3Mg
sm.addBatch(sql2); 1S+;ZMk
... 7)B&(2D&
sm.executeBatch() x1t{SQ-C
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ctp?y
2、PreparedStatement {/-y>sm
PreparedStatement ps = cn.preparedStatement(sql); j_!bT!8
{ rei
8LW
ps.setXXX(1,xxx); dX_!0E[c
... L<bYRGz
ps.addBatch(); J"diFz+20
} ( V$Zc0
ps.executeBatch(); 9 0X?1
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 t";{1.
2ubmsbt$
事务的处理 {bT9VZ>
1、关闭Connection的自动提交 j3
6,w[Y:
cn.setAutoCommit(false); <v]z6B@9!
2、执行一系列sql语句 ~ct2`M$TL(
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 0z<H(|
Statement sm ; lwVk(l
Z
sm = cn.createStatement(insert into user...); 2$M,*Dnr
sm.executeUpdate(); ]53O}sH>
sm.close(); y|^EGnaE
sm = cn.createStatement("insert into corp...); *~cqr
sm.executeUpdate(); 3I|O^
sm.close(); ERF,tLa!
3、提交 w'A tf
cn.commit(); ar Q)%W
4、如果发生异常,那么回滚 %Nj #0YF]
cn.rollback();