java 数据库基本操作 @|h9jx|
1、java数据库操作基本流程 bOU"s>?
2、几个常用的重要技巧: Sa)sDf1+`
可滚动、更新的记录集 aid1eF
批量更新 AyUw
事务处理 NPv.7,
w\[l4|g`
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ?9?A)?O<j~
1、取得数据库连接 7oZ Pb
1)用DriverManager取数据库连接 /7#MJH5b6
例子 :}36;n<['
String className,url,uid,pwd; {1=|H$wKg
className = "oracle.jdbc.driver.OracleDriver"; %4`
U' j
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; AP z"k?D0
uid = "system"; tvno3"
pwd = "manager"; 3AENY@*
Class.forName(className); PcbhylKd
Connection cn = DriverManager.getConnection(url,uid,pwd); +*Wlj8
2)用jndi(java的命名和目录服务)方式 jD<xpD
例子 6
o
String jndi = "jdbc/db"; W.s8!KH:
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); erv94acq
DataSource ds = (DataSource) ctx.lookup(jndi); nN.Gn+Cl
Connection cn = ds.getConnection(); Yt =)=n
多用于jsp中 Bi9Q8#lh
2、执行sql语句 g/l:q&Q<
1)用Statement来执行sql语句 RFsUb:%V7-
String sql; x?A<X2
Statement sm = cn.createStatement(); *Dq ++
sm.executeQuery(sql); // 执行数据查询语句(select) byP< !p*
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); )Vy0V=
2)用PreparedStatement来执行sql语句 dHAT($QG
String sql; a:GM|X
sql = "insert into user (id,name) values (?,?)"; Qm7];,
PreparedStatement ps = cn.prepareStatement(sql); Uufig)6
ps.setInt(1,xxx); zrSYLG
ps.setString(2,xxx); L[:AU e
... [&P@0Fn
ResultSet rs = ps.executeQuery(); // 查询 PI$i_3N
int c = ps.executeUpdate(); // 更新 dYOY8r/
)^P54_2
3、处理执行结果 *[i49X&rd
查询语句,返回记录集ResultSet Nk7=[y#z
更新语句,返回数字,表示该更新影响的记录数 u,:hT]
~+
ResultSet的方法 0datzEns`
1、next(),将游标往后移动一行,如果成功返回true;否则返回false #:[F=2@,A
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 zC:Pg4=w]
->OVNmCB`+
4、释放连接 nT01B1/<]
cn.close(); \7h>9}wGf
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection A#K<5%U{Mv
J9t?;3
可滚动、更新的记录集 1D)0\#><
1、创建可滚动、更新的Statement H;<>uELie
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); `z q+Xl
该Statement取得的ResultSet就是可滚动的 z{
M2tLNb
2、创建PreparedStatement时指定参数 ' A+L
#
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
PPy~dp
ResultSet.absolute(9000); SHSfe{n
批量更新 bxwwYSS
1、Statement [%yj'
)R/
Statement sm = cn.createStatement(); teb(gUy}L6
sm.addBatch(sql1); 6DU(KYN
sm.addBatch(sql2); 569p/?
... }&L%c>
sm.executeBatch() 8G$BQ
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 7l/ZRz}1
2、PreparedStatement p<\!{5:
PreparedStatement ps = cn.preparedStatement(sql); &N= vs
{ $8(QBZq
ps.setXXX(1,xxx); a_0I)'
?
... w2s06`g
ps.addBatch(); x8C\&ivn
} LibQlNW\
ps.executeBatch(); ~a4Y8r
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ex`T9j.=B
~uq010lMno
事务的处理 F
=*4]O
1、关闭Connection的自动提交 }%PK %/ zI
cn.setAutoCommit(false); S"?fa)~
2、执行一系列sql语句 |ssl0/nk
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close IUEpE9_
Statement sm ;
mT -[I<
sm = cn.createStatement(insert into user...); $aU.M3
sm.executeUpdate(); .Mb0++% W
sm.close(); 7BINqVS&
sm = cn.createStatement("insert into corp...); =Yl ea,S
sm.executeUpdate(); dR_6j}
sm.close(); Id`V`|q
3、提交 A15Kj#Oy
cn.commit(); Lj GZp"&{
4、如果发生异常,那么回滚 \1<|X].jNY
cn.rollback();