java 数据库基本操作 L54]l^ls>
1、java数据库操作基本流程 nb.|^O?
2、几个常用的重要技巧: -wT!g;v;%
可滚动、更新的记录集 ` {qt4zd0
批量更新 .I?~R:(Ig
事务处理 CTS1."kx1
q
BIekQT
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 u].7+{
1、取得数据库连接 4T-"\tmg/
1)用DriverManager取数据库连接 B!
P/?
例子 +e,c'.
String className,url,uid,pwd; 9a]{|M9
className = "oracle.jdbc.driver.OracleDriver"; \zcR75
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; as(/
>p
uid = "system"; )8!*,e=4
pwd = "manager"; W7. +
Class.forName(className); la}cGZ; p.
Connection cn = DriverManager.getConnection(url,uid,pwd); f^ja2.*%?
2)用jndi(java的命名和目录服务)方式 a^8PB|G
例子 ^
L]e]<h(
String jndi = "jdbc/db"; /J(vqYK"
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); wn;)La
DataSource ds = (DataSource) ctx.lookup(jndi); Bf.iRh0Q5
Connection cn = ds.getConnection(); "BVp37m;?
多用于jsp中 h*R w^5,c
2、执行sql语句 {a__/I>)
1)用Statement来执行sql语句 S:XsO9:{
String sql; Sn0kJIb
}
Statement sm = cn.createStatement(); l5 ]
sm.executeQuery(sql); // 执行数据查询语句(select) fwvwmZW
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); !1=*"H%t
2)用PreparedStatement来执行sql语句 v;`>pCal
String sql; bZ_TW9mq
sql = "insert into user (id,name) values (?,?)"; pztfm'
PreparedStatement ps = cn.prepareStatement(sql); mITNx^p4f
ps.setInt(1,xxx); eyuyaSE
ps.setString(2,xxx); ):_@i
... e=nvm'[h
ResultSet rs = ps.executeQuery(); // 查询
Q6RTH
int c = ps.executeUpdate(); // 更新 ;NH^+h
$H)QUFyC
3、处理执行结果 t.dr<
查询语句,返回记录集ResultSet |dz"uIrT
更新语句,返回数字,表示该更新影响的记录数 b50mMWtG
ResultSet的方法 xKl1DIN[
1、next(),将游标往后移动一行,如果成功返回true;否则返回false x0b=r!Duu
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 zO---}[9a
h5rR44
4、释放连接 ?%[~J
cn.close(); r
^\(M
{
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection peF)U
!`D
1yZA_x15:
可滚动、更新的记录集 *`rfD*
1、创建可滚动、更新的Statement uIbAlE
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ZSs@9ej
该Statement取得的ResultSet就是可滚动的 y%X!l(gQ
2、创建PreparedStatement时指定参数 5|=J\Lp2I
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); x9AFN
ResultSet.absolute(9000); #%2 d;V
批量更新 cS'{h
1、Statement zPxR=0|
Statement sm = cn.createStatement(); S2e3d
sm.addBatch(sql1); YVwpqOE.=
sm.addBatch(sql2); Xl<iR]lda
... 71y{Dwya
sm.executeBatch() x\U[5d
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 "V(P)_
2、PreparedStatement K"x_=^,Yu*
PreparedStatement ps = cn.preparedStatement(sql); K2yu}F ^}
{ e MHz/;I
ps.setXXX(1,xxx); p #{y9s4h
... 9=~ZA{0J
ps.addBatch(); {x?qz~W
} p0WUF\"
ps.executeBatch(); Q3(ulgl]
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 @,n)1*{P
I8YUq
事务的处理 &
Wod
1、关闭Connection的自动提交 tj'~RQvO
cn.setAutoCommit(false); \yu7,v
2、执行一系列sql语句 -2; 6Pwmv
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 6^WNwe\
Statement sm ; bY2R/FNL=
sm = cn.createStatement(insert into user...); 3i7EF.
sm.executeUpdate(); w;gk=<_
sm.close(); '.1P\>x!]
sm = cn.createStatement("insert into corp...); QM#Vl19>j(
sm.executeUpdate(); ~f(5l.
sm.close(); /wLGf]0
3、提交 W-l+%T!
cn.commit(); xa@$cxt
4、如果发生异常,那么回滚 X!qK[b@Z
cn.rollback();