java 数据库基本操作 xR8y"CpE
1、java数据库操作基本流程 PeIKx$$Kl{
2、几个常用的重要技巧: uFA}w:Fm
可滚动、更新的记录集 V?)YQB
批量更新 eX1_=?$1P
事务处理 +|Izjx]ZV
$xCJ5M4
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 %(|-+cLW+
1、取得数据库连接 8DX5bB
1)用DriverManager取数据库连接 5=\^DeM@
H
例子 KZO[>qC"R
String className,url,uid,pwd; eLLOE)x
className = "oracle.jdbc.driver.OracleDriver"; 'P*OzZ4>$
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; A'$>~Ev
uid = "system"; znDpg{U(
pwd = "manager"; Jd~M q9(
Class.forName(className); h^v#?3.@
Connection cn = DriverManager.getConnection(url,uid,pwd); Ii#+JY0k
2)用jndi(java的命名和目录服务)方式 +@c$n`>)
例子 u{7->[=
String jndi = "jdbc/db"; -oTdi0P
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); * =*\w\
te
DataSource ds = (DataSource) ctx.lookup(jndi); L1WvX6
Connection cn = ds.getConnection(); *pDS%,$xe
多用于jsp中 U&43/;<,
2、执行sql语句 X"vDFE`?
1)用Statement来执行sql语句 I:w+lchAMe
String sql; 3,EtyJ3[Bh
Statement sm = cn.createStatement(); na*Z0y
sm.executeQuery(sql); // 执行数据查询语句(select) el\xMe^SY
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ]TJ258P}
2)用PreparedStatement来执行sql语句 U_hzSf
String sql; E62_k
0q
sql = "insert into user (id,name) values (?,?)"; Ls+vWfF=#
PreparedStatement ps = cn.prepareStatement(sql); ej7L-~lxQ
ps.setInt(1,xxx); zK I1
ps.setString(2,xxx); 4 L
5$=V
... JP(0/?Q
ResultSet rs = ps.executeQuery(); // 查询 RP^vx`9h
int c = ps.executeUpdate(); // 更新 QyY<Zi;6
sgnc$x"
3、处理执行结果 _8ks`O#}
查询语句,返回记录集ResultSet nN^lY=3
更新语句,返回数字,表示该更新影响的记录数 unNN&m#@
ResultSet的方法 =**Q\Sl
1、next(),将游标往后移动一行,如果成功返回true;否则返回false %%#bTyF
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ;.<HpDfG_
ZmycK:f
4、释放连接 Jz*A!Li
cn.close(); cj^hwtx
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection xj9xUun
*K&
$9fah
可滚动、更新的记录集 F(ZczwvR
1、创建可滚动、更新的Statement dWu;F^
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Lxv6\3I+
该Statement取得的ResultSet就是可滚动的 {;m|\652B
2、创建PreparedStatement时指定参数 q: X^V$`
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 3[m2F O,Z
ResultSet.absolute(9000); tv Zq):c
批量更新 lon9oraF'
1、Statement -r]L MQ
Statement sm = cn.createStatement(); 2Q7X"ek~[
sm.addBatch(sql1); a]Y9;(
sm.addBatch(sql2); :`lP+y?a1
... }:u-l3e
sm.executeBatch() Sx (E'?]
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 |qwx3 hQ?
2、PreparedStatement f@$kK?c?
PreparedStatement ps = cn.preparedStatement(sql); lauq(aD_C
{ u#`51Hr$
ps.setXXX(1,xxx); <>Ha<4A
=E
... =(Y0wZP|
ps.addBatch(); N7KG_o%
} ^N7 C/" p
ps.executeBatch(); P!IXcPKW53
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 2aX{r/Lc
sl(go^
事务的处理 yhI;FNSf
1、关闭Connection的自动提交 ]rNxvFN*j
cn.setAutoCommit(false); xn@oNKD0
2、执行一系列sql语句 g>#}(u!PH
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close (9=E5n6o
Statement sm ; vP+qwvpGr
sm = cn.createStatement(insert into user...); HV7f%U
sm.executeUpdate(); T\ukJ25!
sm.close(); 0P{8s
sm = cn.createStatement("insert into corp...); "!fwIEG
sm.executeUpdate(); ;g;1<?
[
sm.close(); !qHB?]
3、提交 yjq|8.L[
G
cn.commit(); 7Ka4?@bQ
4、如果发生异常,那么回滚 6#.9T;&
cn.rollback();