java 数据库基本操作 q<
XFw-Pv
1、java数据库操作基本流程 =/Gd<qz3
2、几个常用的重要技巧:
6sBt6?_T
可滚动、更新的记录集 m ol,iM*l
批量更新 zr/v .$<
事务处理
HG;;M6
"pM>TMAE
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 @."K"i'Bl
1、取得数据库连接 w.q`E@ T*
1)用DriverManager取数据库连接 =&z+7Pe[
例子 2y
-
QH
String className,url,uid,pwd; @G"nkB
className = "oracle.jdbc.driver.OracleDriver"; QN#"c
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; bzFac5n)Q
uid = "system"; a+E
8s7C/D
pwd = "manager"; DK74s
Class.forName(className); e Ucbe33
Connection cn = DriverManager.getConnection(url,uid,pwd); -qc'J<*^4
2)用jndi(java的命名和目录服务)方式 pi?/]}:
例子 p^pd7)sBr
String jndi = "jdbc/db"; ga;nM#/
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Uj7YTB
DataSource ds = (DataSource) ctx.lookup(jndi); e,JBz~CK*w
Connection cn = ds.getConnection(); /oT~CB..
多用于jsp中 ZAr6RRv ^
2、执行sql语句 H~Uf2A)C
1)用Statement来执行sql语句 ,)1C"'
String sql; SE+hB
Statement sm = cn.createStatement(); TcaW'&(K
sm.executeQuery(sql); // 执行数据查询语句(select) V
vrsf6l]
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ,`bW(V
2)用PreparedStatement来执行sql语句 },8|9z#pyB
String sql; NftnbsTmy
sql = "insert into user (id,name) values (?,?)"; ku5|cF*%
PreparedStatement ps = cn.prepareStatement(sql); Cw,a)XB
ps.setInt(1,xxx); G'\[dwD,u
ps.setString(2,xxx); yv4x.cfI2W
... \6|y~5Hw{r
ResultSet rs = ps.executeQuery(); // 查询 1m~|e.g_'`
int c = ps.executeUpdate(); // 更新 Mt4
3Y)&[aj
3、处理执行结果 }_nBegv
查询语句,返回记录集ResultSet mD9Iao%4~
更新语句,返回数字,表示该更新影响的记录数 |Q/LC0?
ResultSet的方法 IU8zidn&
1、next(),将游标往后移动一行,如果成功返回true;否则返回false cb^IJA9}
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 $VmV>NZ
~^2w)-N
4、释放连接 6Cy Byj&
cn.close(); 3N_KNW
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Ak?9a_f
M2Nh3ijr
可滚动、更新的记录集 KR( apO
1、创建可滚动、更新的Statement PEI$1,z
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); {N2GRF~c-y
该Statement取得的ResultSet就是可滚动的 8xLQ"
l+"
2、创建PreparedStatement时指定参数 *|y'%y
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ww{k_'RRJ
ResultSet.absolute(9000); FEk9a^Xyx
批量更新 Xex7Lr&
1、Statement ^aB;Oo
Statement sm = cn.createStatement(); g$uiwqNA%
sm.addBatch(sql1); wO,qFY
sm.addBatch(sql2); +ywz@0nx
... jr`T6!\
sm.executeBatch() Z;uKnJh
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 zeMV_rW~
2、PreparedStatement @ym:@<D
PreparedStatement ps = cn.preparedStatement(sql); nk|(cyt)
{ C1;uAw?\
ps.setXXX(1,xxx); <9]"p2
... 2E-Kz?,:[
ps.addBatch(); m~+.vk
} r ~{nlLO}
ps.executeBatch(); "q?(rx;
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 (]q
([e
<#:iltO
事务的处理 oO
tjG3B({
1、关闭Connection的自动提交 %`bs<ZWT
cn.setAutoCommit(false); %Ik5|\ob?
2、执行一系列sql语句 JYc:@\
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ;j T{<
Y
Statement sm ; 12
)
sm = cn.createStatement(insert into user...); rPB Ju0D"
sm.executeUpdate(); t%mi#Gh(
sm.close(); MEI&]qI
sm = cn.createStatement("insert into corp...); wf ]Wm
sm.executeUpdate(); s>DFAu!
sm.close(); 0")_%
3、提交 ]4t1dVD
cn.commit(); oT}$N_gFT
4、如果发生异常,那么回滚 c\.)vH
cn.rollback();