java 数据库基本操作 HNFG:t9
1、java数据库操作基本流程 7FQ&LF46
2、几个常用的重要技巧: G[;GP0\N
可滚动、更新的记录集 x%J4A+kU
批量更新 tBJCfM
事务处理 j<BW/
U-b(
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 PTt#Ixn,
1、取得数据库连接 uItzFX*
1)用DriverManager取数据库连接 .mr&zq
例子
>M2~BDZ
String className,url,uid,pwd; o8PK,!Pl
className = "oracle.jdbc.driver.OracleDriver"; T/m4jf2
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Z4&,KrV
uid = "system"; j@7%%
pwd = "manager"; FR bmeq3c
Class.forName(className); &oU) ,H
Connection cn = DriverManager.getConnection(url,uid,pwd); B^;G3+}
2)用jndi(java的命名和目录服务)方式 XBvJc'(s
例子 8Uv2p{ <#
String jndi = "jdbc/db"; @ )bCh(u
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); D90.z"N\i9
DataSource ds = (DataSource) ctx.lookup(jndi); {c(@u6l28
Connection cn = ds.getConnection(); BVJ6U[h`
多用于jsp中 5mtsN#
2、执行sql语句 D7X8yv1
1)用Statement来执行sql语句 &3@{?K
String sql; 6}(;~/L
Statement sm = cn.createStatement(); %a'Nf/9=:
sm.executeQuery(sql); // 执行数据查询语句(select) nBN+.RB:(
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Za"m;+H<E
2)用PreparedStatement来执行sql语句 !Dc|g~km\
String sql; JY5)^<.d
sql = "insert into user (id,name) values (?,?)"; ~!t# M2Sk
PreparedStatement ps = cn.prepareStatement(sql); E~4d6~s
ps.setInt(1,xxx); RWX?B
ps.setString(2,xxx); 3Ygt!
... \/wbk`2
ResultSet rs = ps.executeQuery(); // 查询 sxP1.= W
int c = ps.executeUpdate(); // 更新 Q+i
z(o zMH
3、处理执行结果 uPbGQ :%}
查询语句,返回记录集ResultSet 80'!XKSP
更新语句,返回数字,表示该更新影响的记录数 KxA^?,t[
ResultSet的方法 5 R*
1、next(),将游标往后移动一行,如果成功返回true;否则返回false >'/KOK"
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 o(gEyK
\#yKCA';
4、释放连接 Xur{nk~?
cn.close(); gpvzOW/
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection hOOkf mOM
?"+g6II
可滚动、更新的记录集 y;GwMi$KI
1、创建可滚动、更新的Statement g,k} nkIT
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); rDD,eNjG
该Statement取得的ResultSet就是可滚动的 tCF,KP?
2、创建PreparedStatement时指定参数 w%3*T#tp
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); N I*x):bx
ResultSet.absolute(9000); ],W/IDv
批量更新 B$\,l.hE
1、Statement 6r]l8*34;
Statement sm = cn.createStatement(); u&E$(
sm.addBatch(sql1); :j<ij]rsI
sm.addBatch(sql2); T4c]VWtD
... D#.N)@\
sm.executeBatch()
|/YwMBi
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 "p"M9P'
2、PreparedStatement e`7dRnx&0
PreparedStatement ps = cn.preparedStatement(sql); *WQl#JAr
{ K/;*.u`:
ps.setXXX(1,xxx); MEI.wJZ
... ,UveH` n-
ps.addBatch(); Xc}~_.]
} ((AsZ$[S
ps.executeBatch(); =O.%)|
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 H\PY\O&cP
m4m,-}KNi
事务的处理 J
,s9,("
1、关闭Connection的自动提交 -W\1n#J
cn.setAutoCommit(false); &{R]v/{p]
2、执行一系列sql语句 SK]"JSY`
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close s(?A=JJ
Statement sm ; 4nz$Ja)
sm = cn.createStatement(insert into user...); {F'~1qf
sm.executeUpdate(); 1y{@fg~..
sm.close(); y@'~fI!E4
sm = cn.createStatement("insert into corp...); ir?Y>
sm.executeUpdate(); =qNZ7>Qw
sm.close(); bCSgdK
3、提交 &F 3'tf?
cn.commit(); +lNAog
4、如果发生异常,那么回滚 "J=A(w5
cn.rollback();