java 数据库基本操作 v{oHC4
1、java数据库操作基本流程 uL
|O<
2、几个常用的重要技巧: 2c%b
可滚动、更新的记录集 !]l;n
Fd
批量更新 g4}K6)@
事务处理 Nc:0opPM
g^[BnP)I
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 3.w &e0Es
1、取得数据库连接 67]!xy
1)用DriverManager取数据库连接 a}V<CBi
例子 x/uC)xm
String className,url,uid,pwd; O]80";Uv
className = "oracle.jdbc.driver.OracleDriver"; $aDkZj
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; y4Lh:;
uid = "system"; 2!?=I'uMA
pwd = "manager"; ]+d>;$O
Class.forName(className); 'pC51}[A{^
Connection cn = DriverManager.getConnection(url,uid,pwd); C(&3L[
2)用jndi(java的命名和目录服务)方式 tb;u%{S
例子 , d7o/8u
String jndi = "jdbc/db"; #r'S@:[
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 2k+u_tj>
DataSource ds = (DataSource) ctx.lookup(jndi); )uC5
Connection cn = ds.getConnection(); 1-~sj)*k
多用于jsp中 AQTV1f_
2、执行sql语句 T0"q,lrdxV
1)用Statement来执行sql语句 MQq!<?/
String sql; %nhE588xf
Statement sm = cn.createStatement(); %:yVjb,Yf
sm.executeQuery(sql); // 执行数据查询语句(select) Vu;z|L
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); gfQ1p ?
2)用PreparedStatement来执行sql语句 X{8g2](z.
String sql; +k\cmDcb
sql = "insert into user (id,name) values (?,?)"; }TRVCF1
PreparedStatement ps = cn.prepareStatement(sql); ][B>`gC-
ps.setInt(1,xxx); b] ~
ps.setString(2,xxx); ?<U">8cP
... /-&2>4I
ResultSet rs = ps.executeQuery(); // 查询 ="P&!lu
int c = ps.executeUpdate(); // 更新 S=qx,<J
39
2>/}-a
3、处理执行结果 QSyPtjg]
查询语句,返回记录集ResultSet iyP0;$
更新语句,返回数字,表示该更新影响的记录数 kerBy\^
ResultSet的方法 TnJJ& "~3b
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Ny
G?^
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 #]z_pp:
\CrWKBL
4、释放连接 M?QX'fia
cn.close(); O6n]l
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Xd5uF/w
#A=ER[[
可滚动、更新的记录集 hE;BT>_dn
1、创建可滚动、更新的Statement G-5ezVli
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 3 uJ?;
该Statement取得的ResultSet就是可滚动的 6"/4@?
2、创建PreparedStatement时指定参数 4ZtsLMwLD
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Ao$|`Lgj=z
ResultSet.absolute(9000); (w-@b70E
批量更新 [ps5
1、Statement ?wREX[Tqs
Statement sm = cn.createStatement(); o ^""=Z
sm.addBatch(sql1); 30{WGc@l#
sm.addBatch(sql2); ]K|td)1X
... -`,Fe3
sm.executeBatch() OPC8fX5.
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 xM**n3SZ`
2、PreparedStatement Bb.U4#
PreparedStatement ps = cn.preparedStatement(sql);
liPaT
{ +^ `n- m
ps.setXXX(1,xxx); <ToRPx&E
... ;&$f~P Q
ps.addBatch(); 3`Gb;D
} <v3pI!)x
ps.executeBatch(); 2#R8}\
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 _*CbtQb5
3u[5T|D'
事务的处理 !7Nz_d~n
1、关闭Connection的自动提交 W|\$}@>
cn.setAutoCommit(false); Ca
?d8
2、执行一系列sql语句 v$#l]A_D
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close T9bUt |
Statement sm ; lsKQZ@LN`
sm = cn.createStatement(insert into user...); ,AwX7gx22
sm.executeUpdate(); x+EEMv3u:
sm.close(); 8dwKJ3*.
sm = cn.createStatement("insert into corp...); IGF25-7B
sm.executeUpdate(); f0+vk'Z
sm.close(); NR98]X
3、提交 :H>0/^Mg0
cn.commit(); w+iIay
4、如果发生异常,那么回滚 a;=IOQ
cn.rollback();