java 数据库基本操作 s18A
1、java数据库操作基本流程 :) T#.(mR
2、几个常用的重要技巧: JiiYl
可滚动、更新的记录集 qn `
\g
批量更新 TZ PUVOtL_
事务处理 WhDNt+uk)
uHyc7^X>
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 6H|&HV(!R
1、取得数据库连接 OC`Mzf%.
1)用DriverManager取数据库连接 {z8wFL\
例子 qkq^oHI
String className,url,uid,pwd; <;dFiI-GO#
className = "oracle.jdbc.driver.OracleDriver"; ='HLA-uT
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; g"D:zK)
uid = "system"; 37|EG
pwd = "manager"; 4HyD=6V#
Class.forName(className); e`%<D[-
Connection cn = DriverManager.getConnection(url,uid,pwd); ,v(ikPzd
2)用jndi(java的命名和目录服务)方式 e{*z4q1
例子 iD:TKB_r
String jndi = "jdbc/db"; 8{p#Nl?U1
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); kT&GsR/
DataSource ds = (DataSource) ctx.lookup(jndi); ?O/!pUAu
Connection cn = ds.getConnection(); /Fp@j/50
多用于jsp中 +<c(;Ucl?
2、执行sql语句 7T=:dv
1)用Statement来执行sql语句 g|)yM^Vqr6
String sql; ?;p45y~n%
Statement sm = cn.createStatement(); s%)>O{{)
sm.executeQuery(sql); // 执行数据查询语句(select) 4zf(
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); n*N`].r#{=
2)用PreparedStatement来执行sql语句 \p J<@
String sql; 6am<V]Hw0F
sql = "insert into user (id,name) values (?,?)"; 2B]mD-~
PreparedStatement ps = cn.prepareStatement(sql); +InFv"wt
ps.setInt(1,xxx); 4J2C#Cs
ps.setString(2,xxx); O4,?C)
... NQ\<~a`Eq
ResultSet rs = ps.executeQuery(); // 查询 :z+l=d:4
int c = ps.executeUpdate(); // 更新 f >\~h,SLL
~"WN4
3、处理执行结果 ] U[4r9V
查询语句,返回记录集ResultSet oo!JAv}~
更新语句,返回数字,表示该更新影响的记录数 [L>AU;
:
ResultSet的方法 /3d6Og
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ?,*KA Gg%
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ef
-PlGn
qjLFgsd
4、释放连接 fb|lWEw5h.
cn.close(); _U%2J4T2
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection nnMRp7LQ-
((]Sy,rdk
可滚动、更新的记录集 &+8cI^kp
1、创建可滚动、更新的Statement 'V:ah38
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); /??nOVvt
该Statement取得的ResultSet就是可滚动的 +rOd0?
2、创建PreparedStatement时指定参数 <0H^2ekd
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); b'G!)n
ResultSet.absolute(9000); =' #yG(h
批量更新 <z-+{-?z~
1、Statement E%\Ohs7
Statement sm = cn.createStatement(); >/DlxYG?
sm.addBatch(sql1); hSSFmEpr
sm.addBatch(sql2); %ZJ;>a#
... $U}GX'1LZ
sm.executeBatch() bF? {
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 O.OSLezTQ
2、PreparedStatement &e1(| qax
PreparedStatement ps = cn.preparedStatement(sql); R}\n@X*
{ z4*`K4W
ps.setXXX(1,xxx); k54Vh=p
... 1WLaJ%Fv
ps.addBatch(); :%"$8o*0W
} =^gZJ@
ps.executeBatch(); 2k"!o~s^
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 VAZ6;3@cd
k>7 2W/L^
事务的处理 hdx"/.s
1、关闭Connection的自动提交 VeWvSIP,EQ
cn.setAutoCommit(false); G^_fbrZjN
2、执行一系列sql语句 ;bes#|^F
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close @ykM98K
Statement sm ; I0C$
sm = cn.createStatement(insert into user...); (Zv/(SE5%
sm.executeUpdate(); w;KNS'
sm.close(); m}?(c)ST
sm = cn.createStatement("insert into corp...); Y@[Dy
sm.executeUpdate(); hZLwg7X!
sm.close(); ;Fm7!@u^0
3、提交 WY" `wM
cn.commit(); H6]z9 8
4、如果发生异常,那么回滚 wdTjJfr
cn.rollback();