java 数据库基本操作 !^rITiy
1、java数据库操作基本流程 \f~u85
2、几个常用的重要技巧: ?^F*"+qI
可滚动、更新的记录集 'lSnyW{
批量更新 %>oT7|x
事务处理 U<#$w{d:
hA$c.jJr.Z
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Vw6>:l<+<
1、取得数据库连接 W`
6"!V
1)用DriverManager取数据库连接 y81#UD9[
例子 6tCV{pgm
String className,url,uid,pwd; `"-`D!U?$
className = "oracle.jdbc.driver.OracleDriver"; F='jmiVJ
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Lcm~QF7cd
uid = "system"; vUA)#z<
pwd = "manager"; d7n4zx1Hh
Class.forName(className); Rq~
>h99M
Connection cn = DriverManager.getConnection(url,uid,pwd); Phk`=:xh
2)用jndi(java的命名和目录服务)方式 bs4fyb
例子 woC
FN1W
String jndi = "jdbc/db"; mRix0XBI~
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 0Te)s3X
DataSource ds = (DataSource) ctx.lookup(jndi); q|de*~@-P
Connection cn = ds.getConnection(); x(T!I&i={
多用于jsp中 T/X?ZK(T
2、执行sql语句 I3F6-gH
1)用Statement来执行sql语句 [v>Z(
String sql; Al;%u0]5
Statement sm = cn.createStatement(); Vb"T],N1m
sm.executeQuery(sql); // 执行数据查询语句(select) N
P0Hgd
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); k1@
A'n
2)用PreparedStatement来执行sql语句 wjw<@A9
String sql; l=<F1L z
sql = "insert into user (id,name) values (?,?)"; R
oF
PreparedStatement ps = cn.prepareStatement(sql); ,
.NG.Q4f
ps.setInt(1,xxx); N23+1 h
ps.setString(2,xxx); h|Teh-@A5
... _
cHV3cz
ResultSet rs = ps.executeQuery(); // 查询 +)''l
int c = ps.executeUpdate(); // 更新 `i_L?C7
h<!khWFS
3、处理执行结果 /I`!iK
查询语句,返回记录集ResultSet -hJ>wGI
更新语句,返回数字,表示该更新影响的记录数 HquB*=^xh
ResultSet的方法 nATfmUN
L
1、next(),将游标往后移动一行,如果成功返回true;否则返回false }(O D<
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 nOL 25 Y:
._F6- pl
4、释放连接 ft.}$8vIT
cn.close(); Y ~\`0?ST
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection VAG+y/q
zN8&M<mTl
可滚动、更新的记录集 ^`B##9g~
1、创建可滚动、更新的Statement dcc%G7w
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); c=U$$|qHV
该Statement取得的ResultSet就是可滚动的 6#lC(ko'
2、创建PreparedStatement时指定参数 _g/TH-;^
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); /^es0$Co.
ResultSet.absolute(9000); (tz_D7c$F
批量更新
}tS6Z:fOY
1、Statement Ke;X3j ]`
Statement sm = cn.createStatement(); m}'t'l4 c
sm.addBatch(sql1); UHsrZgIRYT
sm.addBatch(sql2); o )}<
... 3T.M?UG>
sm.executeBatch() el*pYI
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 AD4L`0D
2、PreparedStatement 6@Z'fT4
PreparedStatement ps = cn.preparedStatement(sql); OKLggim{
{ j@_) F^12
ps.setXXX(1,xxx); JWm^RQ
... @{$Cv"6769
ps.addBatch(); \Z7([G h
} o\:f9JL
ps.executeBatch(); =-s20mdj
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 M
b /X@51
$'mB 8 S
事务的处理 Ubos#hP
1、关闭Connection的自动提交 Xxsnpb>
cn.setAutoCommit(false); #Ot*jb1
2、执行一系列sql语句 ^Hhw(@`qf
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close K
{1ZaEH
Statement sm ; >[P7Zlwv4
sm = cn.createStatement(insert into user...); ^J}$y7
sm.executeUpdate(); GVHfN5bTqn
sm.close(); +68K[s,FD
sm = cn.createStatement("insert into corp...); ~)_ ?:.Da
sm.executeUpdate(); :pF]TY"K.
sm.close(); 94k)a8-!
3、提交 {-7yZ]OO$
cn.commit(); EX_sJ c
4、如果发生异常,那么回滚 ;
K
6Fe)
cn.rollback();