java 数据库基本操作 V8w7U:K
1、java数据库操作基本流程 34*73WxK
2、几个常用的重要技巧: UWW^g@d4
可滚动、更新的记录集 uBp,_V?
批量更新 y ;/T.W9!
事务处理 .2Q4EbM2
W)X" G3
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 8=K%7:b
1、取得数据库连接 C33BP}c]
1)用DriverManager取数据库连接 hQeGr2gMq
例子 xNrPj8V<Y
String className,url,uid,pwd; /M :7
className = "oracle.jdbc.driver.OracleDriver"; jj,CBNo(
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; -/V,<@@T
uid = "system"; N!PPL"5z
pwd = "manager"; Vjdu9Ez
Class.forName(className); tG7F!um(
Connection cn = DriverManager.getConnection(url,uid,pwd); 6N49q-.Lg
2)用jndi(java的命名和目录服务)方式 (HEi;
例子 3 as~yF0
String jndi = "jdbc/db"; opXxtYC@
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); K N Y
DataSource ds = (DataSource) ctx.lookup(jndi); )_&P:;N
Connection cn = ds.getConnection(); %K`th&331
多用于jsp中 bIWSNNV0F
2、执行sql语句 JpRn)e'Z
1)用Statement来执行sql语句 !"g2F}n
String sql; JRw<v4pZ
Statement sm = cn.createStatement(); Ao )\/AR'
sm.executeQuery(sql); // 执行数据查询语句(select) QkFB\v
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); aZ,j1j0p
2)用PreparedStatement来执行sql语句 =ea'G>;[H
String sql; q"48U.}T
sql = "insert into user (id,name) values (?,?)"; l`bl^~xRo
PreparedStatement ps = cn.prepareStatement(sql); 5g q
ps.setInt(1,xxx); k/Z]zZC
ps.setString(2,xxx); NR>&1aRbyb
... sck.2-f"
ResultSet rs = ps.executeQuery(); // 查询 =dT
#x
int c = ps.executeUpdate(); // 更新 (+CNs
+F?}<P_v
3、处理执行结果 tP:ER
查询语句,返回记录集ResultSet lC=-1*WH
更新语句,返回数字,表示该更新影响的记录数 9bQD"%ha=d
ResultSet的方法 <e?1&5 6
1、next(),将游标往后移动一行,如果成功返回true;否则返回false [59g] ')
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Y|l&mK?
erQQ_
4、释放连接 1!%T<!A.
cn.close(); zv-9z
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Yu}[RXC(=
4C#r=Uw`
可滚动、更新的记录集 hS 9^Bi
1、创建可滚动、更新的Statement pJ3-f k"i
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); w61*jnvi@
该Statement取得的ResultSet就是可滚动的 6Y%{ YQ}s|
2、创建PreparedStatement时指定参数 2@6Qifxd@
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Ueu~803~
ResultSet.absolute(9000); N79?s)l:K
批量更新 3Q#Tut
1、Statement Ez/>3:;
Statement sm = cn.createStatement(); i*]$_\yl"
sm.addBatch(sql1); dEI]|i
r
sm.addBatch(sql2); xrZzfg
... M?d (-en
sm.executeBatch() }Ip1|Gj
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 o(gV;>I
2、PreparedStatement h3[x ZJO
PreparedStatement ps = cn.preparedStatement(sql); o?g9Grk
{ TFNB%|
ps.setXXX(1,xxx); xV0:K=
... kz"QS.${
ps.addBatch(); h+!@`c>)Y
}
/ M@[ 8
ps.executeBatch(); FfX*bqy
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 v@d]*TG
<^w4+5sT/
事务的处理 OJ1MV 7&
1、关闭Connection的自动提交 ;d.gVR_V
cn.setAutoCommit(false); V2SHF
2、执行一系列sql语句 Q-?6o
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close :'4",
Statement sm ; >qU5 (M_&L
sm = cn.createStatement(insert into user...); }0C v J4
sm.executeUpdate(); hRNnj
sm.close(); sd _DG8V
sm = cn.createStatement("insert into corp...); -uNM_|MO
sm.executeUpdate(); =`k',V_
sm.close(); %,+&Kl
I
3、提交 )&$mFwf
cn.commit(); m@W>ku
4、如果发生异常,那么回滚 4 'DEdx,&f
cn.rollback();