java 数据库基本操作 o4: e1
1、java数据库操作基本流程 !ak760*A
2、几个常用的重要技巧: y ;mk]
可滚动、更新的记录集 R?{_Q<17
批量更新 w[a(I}x
事务处理 h[!@8
]9_tto!/
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 b~ )@e9
1、取得数据库连接 a2?@OJ
1)用DriverManager取数据库连接 'Rnzu0<lF
例子 (Jb#'(~a
String className,url,uid,pwd; zw'%n+5m
className = "oracle.jdbc.driver.OracleDriver"; @GXKqi
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; C D6N8n]
uid = "system"; nh7_
jEX
pwd = "manager"; DhxS@/
Class.forName(className); 1q=Q/L4P
Connection cn = DriverManager.getConnection(url,uid,pwd); :tbI=NDb
2)用jndi(java的命名和目录服务)方式 Sg%s\p]N_#
例子 \ v+>qY<q
String jndi = "jdbc/db"; C-ORI}o
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); %4`
U' j
DataSource ds = (DataSource) ctx.lookup(jndi); $+2QbEk&-
Connection cn = ds.getConnection(); W*iTg%a\k
多用于jsp中 C@;e<
2、执行sql语句
&I-T
1)用Statement来执行sql语句 D]>Z5nr |
String sql; G8'{nPA~
Statement sm = cn.createStatement(); J e|
sm.executeQuery(sql); // 执行数据查询语句(select) An}RD73!w
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Fa`%MR1
2)用PreparedStatement来执行sql语句 ?=)lbSu
K
String sql; P )oNNY6}
sql = "insert into user (id,name) values (?,?)"; 7V@r^/`8N
PreparedStatement ps = cn.prepareStatement(sql); iM7^
ps.setInt(1,xxx); s[eSPSFZ
ps.setString(2,xxx); PI$i_3N
... A|K=>7n]U
ResultSet rs = ps.executeQuery(); // 查询 6.tA$#6HP
int c = ps.executeUpdate(); // 更新 oM>UIDCY_v
Nk7=[y#z
3、处理执行结果 bLWY Tj
查询语句,返回记录集ResultSet #?\(l%
更新语句,返回数字,表示该更新影响的记录数 ->OVNmCB`+
ResultSet的方法 :!cK?H$+
1、next(),将游标往后移动一行,如果成功返回true;否则返回false E ,ilJl\
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 *otgI"y\
:Hb`vH3x
4、释放连接 z{
M2tLNb
cn.close(); gREk,4DAv
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection SHSfe{n
]8"U)fzmc.
可滚动、更新的记录集 `#<UsU,~Lu
1、创建可滚动、更新的Statement _pb*kJ
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY);
o,?G(
该Statement取得的ResultSet就是可滚动的 8JQ\eF$ma
2、创建PreparedStatement时指定参数 !#%>,X#+
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Odw'Ua
ResultSet.absolute(9000); <-'
!I&
批量更新 $8(QBZq
1、Statement ?zC{T*a
Statement sm = cn.createStatement(); {U>N*&_`
sm.addBatch(sql1); dg~lz8 0
sm.addBatch(sql2); }:0ru_F)(4
... p-\->_9)y`
sm.executeBatch() }%PK %/ zI
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 2[(~_VJ
2、PreparedStatement LauGT* z!
PreparedStatement ps = cn.preparedStatement(sql); _OjZ>j<B.
{ nhMxw@ Z\
ps.setXXX(1,xxx); co\Il]`R/
... (_@]-
ps.addBatch(); JF~9efWe>
} :
qK-Rku
ps.executeBatch(); X=1o$:7
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 U/AiI;Ne
~4=*kJ#7
事务的处理 &L+.5i
1、关闭Connection的自动提交 } LC
cn.setAutoCommit(false); AWMJ/E*T
2、执行一系列sql语句 ^Lc\{,m
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close `V<jt5TS
Statement sm ; k]$oir
sm = cn.createStatement(insert into user...); H"UJBO>$
sm.executeUpdate(); :] U\{;q2
sm.close(); g=t7YQq_~
sm = cn.createStatement("insert into corp...); #\=7A
sm.executeUpdate(); T\$i=,_$
sm.close(); EZjtZMnj
3、提交 1,)
yEeHjU
cn.commit(); ^Y+C!I
4、如果发生异常,那么回滚 y9d"sqyh
cn.rollback();