java 数据库基本操作 T:p,!?kc7
1、java数据库操作基本流程 8+5z -vd
2、几个常用的重要技巧: 7O84R^!|2
可滚动、更新的记录集 Q ;V `
批量更新 Dl_y[9
事务处理 )u ) ]#z
jq#uBU%
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 i"V2=jTeBv
1、取得数据库连接 @F%H 1
1)用DriverManager取数据库连接 X458%)G!(K
例子 cOkjeHs
5
String className,url,uid,pwd; %eW[`uyV
className = "oracle.jdbc.driver.OracleDriver"; A2LqBirkl
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; wDJbax?
uid = "system"; TY6
D.ikA
pwd = "manager"; MBXja#(k
Class.forName(className); g?'pb*PR
Connection cn = DriverManager.getConnection(url,uid,pwd); )`<-
c2
2)用jndi(java的命名和目录服务)方式 MhaN+N
例子 t6V@00M@
String jndi = "jdbc/db"; k`[ L
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); A2.[P==
DataSource ds = (DataSource) ctx.lookup(jndi); vu-QyPnS|w
Connection cn = ds.getConnection(); 1n|)05p
多用于jsp中 l?F-w;wHN
2、执行sql语句 Ss ;C1:
1)用Statement来执行sql语句 cK6M8:KW
String sql; ZU\TA|
Statement sm = cn.createStatement(); mVUDPMyZ
sm.executeQuery(sql); // 执行数据查询语句(select) V bQ9o
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); t_%6,?S6
2)用PreparedStatement来执行sql语句 MDI[TNYG
String sql; rWzw7T~
sql = "insert into user (id,name) values (?,?)"; 1<g,1TR
PreparedStatement ps = cn.prepareStatement(sql); aMI\gCB/
ps.setInt(1,xxx); *ElR
ps.setString(2,xxx); unn2MP'
... CDOqdBQ
ResultSet rs = ps.executeQuery(); // 查询 iF:`rIC
int c = ps.executeUpdate(); // 更新 BCN<l +u
z@5t7e)!R
3、处理执行结果
;/.ZjTRw
查询语句,返回记录集ResultSet LU
"e9
更新语句,返回数字,表示该更新影响的记录数 l{OU\
ResultSet的方法 c}(fmJB&(
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ,2hZtJ<A
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Gc6`]7 s
eF)vx{s
4、释放连接 DSiI%_[Ud
cn.close(); <tp\+v!u
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection =fy~-FN_
,#;%ILF4%
可滚动、更新的记录集 2Hltgt,
1、创建可滚动、更新的Statement e]N?{s
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); G;r-f63N
该Statement取得的ResultSet就是可滚动的 'Y`.0T[&
2、创建PreparedStatement时指定参数 }ti+tM*
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Z[+H$ =$%
ResultSet.absolute(9000); eyPh^c]?`8
批量更新 gHCk;dmq81
1、Statement oB$7m4xO\
Statement sm = cn.createStatement(); -?)` OHc^
sm.addBatch(sql1); w
s(9@
sm.addBatch(sql2); Zr!he$8(2
... (W.euQy
sm.executeBatch() erG@8CG
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 dno=C
2、PreparedStatement mMLxT3Ci8
PreparedStatement ps = cn.preparedStatement(sql); 7|=*z
{ JUBihw4
ps.setXXX(1,xxx); }M%U}k]+@
... e>"/Uii
ps.addBatch(); "n'LF?/H'
} ;Kb]v\C:
ps.executeBatch(); l+$e|F
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 $'M:H_T
.^]=h#[e
事务的处理 7vBB <\
1、关闭Connection的自动提交 e*[M*u
cn.setAutoCommit(false); t%jB[w&,os
2、执行一系列sql语句 N"d*pi#h
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 6fxf|R\
Statement sm ; 9r@T"$V#c
sm = cn.createStatement(insert into user...); P(N$U^pj
sm.executeUpdate(); F,B, D^WD
sm.close(); S(;3gQ77
sm = cn.createStatement("insert into corp...); `9%Q2Al
sm.executeUpdate(); Mq7d*Bgb
sm.close(); [;5?=X,LD
3、提交 mRIW9V
cn.commit(); U?dd+2^};t
4、如果发生异常,那么回滚 adEcIvN$
cn.rollback();