java 数据库基本操作 Gkfc@[Z V
1、java数据库操作基本流程 y
8./)W&/
2、几个常用的重要技巧: ]0g%)f uMf
可滚动、更新的记录集 OP-%t\sj>
批量更新 x>$!R\Cj
事务处理 Rlq6I?S+
wn$:L9"YN
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 FyZ iiH4|
1、取得数据库连接 uy,ySBY
1)用DriverManager取数据库连接 1f.xZgO/2
例子 I8<s4q
String className,url,uid,pwd; 9hG+?
className = "oracle.jdbc.driver.OracleDriver"; `Al[gG?/!
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; K%p*:P
uid = "system"; kP6P/F|RcZ
pwd = "manager"; {mlJ E>~%
Class.forName(className); kS>'6xXH
Connection cn = DriverManager.getConnection(url,uid,pwd); .%@=,+nqz
2)用jndi(java的命名和目录服务)方式 >Kd(.r[Er
例子 $=97M.E
String jndi = "jdbc/db"; JMMsOA_]
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); kt";Jx
DataSource ds = (DataSource) ctx.lookup(jndi); |sw&sfH[FD
Connection cn = ds.getConnection(); J6!t"eB+
多用于jsp中 :*2+t-
2、执行sql语句 @'EP$!c
1)用Statement来执行sql语句 ,H3C\.%w\
String sql; n},~2
Statement sm = cn.createStatement(); q5$z:'zE
sm.executeQuery(sql); // 执行数据查询语句(select) !(!BW9Zt+
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); c-INVA)
2)用PreparedStatement来执行sql语句 #"M 'Cs
String sql; Lp \%-s#5s
sql = "insert into user (id,name) values (?,?)"; %qzpt{'?<
PreparedStatement ps = cn.prepareStatement(sql); ;z9(
ps.setInt(1,xxx); zS:89y<
ps.setString(2,xxx); "9[K
... Bc4{$sc"O
ResultSet rs = ps.executeQuery(); // 查询 `p&ko$i2
int c = ps.executeUpdate(); // 更新 }*n(RnCn
qj71
rj
3、处理执行结果 h(;qnV'c
查询语句,返回记录集ResultSet (BC3[R@/l
更新语句,返回数字,表示该更新影响的记录数 u.gh04{5
ResultSet的方法 eiZv|?^0
1、next(),将游标往后移动一行,如果成功返回true;否则返回false blZiz2F
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 S,5>g07-`
_"Q
+G@@
4、释放连接 GLb}_-|
cn.close(); DA
oOs}D
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection y(:hN)
Vgs( feGs
可滚动、更新的记录集 x8T5aS
1、创建可滚动、更新的Statement " 7!K'i
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Z'GOp?
该Statement取得的ResultSet就是可滚动的 US)wr
2、创建PreparedStatement时指定参数 NDB ]8C
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); pBt/vS ad
ResultSet.absolute(9000); "b*.>QuZ
批量更新 )_T[thf]
1、Statement )2oWoZvi9
Statement sm = cn.createStatement(); !^ 6x64r
sm.addBatch(sql1); ewgcpV|spn
sm.addBatch(sql2); l)z15e5X
... XJ]MPiXj
sm.executeBatch() 4j!MjlG$
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 dUn8Xqj1
2、PreparedStatement QB@qzgEJ!,
PreparedStatement ps = cn.preparedStatement(sql); 9B'l+nP
{ }i/&m&VU
ps.setXXX(1,xxx); *|Re,cY
... JBE'B Q@
ps.addBatch(); mf@YmKbp
} NV;5T3
ps.executeBatch(); U:MkA(S%c
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 7&klX
)QTk5zt
事务的处理 nl5K1!1
1、关闭Connection的自动提交 1q~U3'l:$
cn.setAutoCommit(false); fB"3R-H?O
2、执行一系列sql语句 >
Q@*o
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close t2OXm
Statement sm ;
$7)O&T*q'
sm = cn.createStatement(insert into user...); *^c4q|G.-
sm.executeUpdate(); VR_+/,~
sm.close(); 1elcP`N1
sm = cn.createStatement("insert into corp...); 2>fG}qYy$
sm.executeUpdate(); Oe$cM=Yf
sm.close(); ynM{hN.+ H
3、提交 30>TxL=&
cn.commit(); NfR, m]
4、如果发生异常,那么回滚 *&UVr
cn.rollback();