java 数据库基本操作 E27wxMU
1、java数据库操作基本流程 B2%)G$B
2、几个常用的重要技巧: %-|Po:6
可滚动、更新的记录集 L@w|2
批量更新 1`2n<qo
事务处理 GwV2`2
g>x2[//pk
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 k/O|ia6
1、取得数据库连接 Qv,|*bf
1)用DriverManager取数据库连接 za'Eom-<u
例子 V<
0gD?Kx
String className,url,uid,pwd; zTBr<:
className = "oracle.jdbc.driver.OracleDriver"; q(e&{pbM)
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; _wKFT>
uid = "system"; eb2~$ ,$
pwd = "manager"; /s(/6~D|
Class.forName(className);
9k ]$MR
Connection cn = DriverManager.getConnection(url,uid,pwd); Ot(U_rJCi
2)用jndi(java的命名和目录服务)方式 3'O+
例子 dl@
String jndi = "jdbc/db"; s"p}>BjMIC
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 07Yh
DataSource ds = (DataSource) ctx.lookup(jndi); afv?z
Connection cn = ds.getConnection(); -]R7[5C:
多用于jsp中 oA}&o_Q%
2、执行sql语句 *f$mSI=
1)用Statement来执行sql语句 MftW^7W-
String sql; +?[TH?2c+
Statement sm = cn.createStatement(); \f1r/e(G|
sm.executeQuery(sql); // 执行数据查询语句(select) <g5Btwo%
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); %F9%t
2)用PreparedStatement来执行sql语句 ?3kfhR
String sql; `UMv#-Y8
sql = "insert into user (id,name) values (?,?)"; /d9I2~}B
PreparedStatement ps = cn.prepareStatement(sql); Cp&lS=
ps.setInt(1,xxx); )?joF)
ps.setString(2,xxx); @a)@1:=Rm
... a Umcs!@
ResultSet rs = ps.executeQuery(); // 查询 5Jd&3pO
int c = ps.executeUpdate(); // 更新 -RVwPY
n>)CCf@H
3、处理执行结果 bdk"7N
查询语句,返回记录集ResultSet ooreforr
更新语句,返回数字,表示该更新影响的记录数 C,hs!v6
ResultSet的方法 u1/4WYJeJ
1、next(),将游标往后移动一行,如果成功返回true;否则返回false /$'tO3
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 &Hb6
\/la`D
4、释放连接 \eH~1@\S
cn.close(); $`.7XD}
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection @zB {Ig
9xyj,;P>
可滚动、更新的记录集 |3/=dG
1、创建可滚动、更新的Statement T|Sz~nO}f
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); iKN~fGRc
该Statement取得的ResultSet就是可滚动的 AcyiP
2、创建PreparedStatement时指定参数 /+.Bc(`
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); iUFS1SN \
ResultSet.absolute(9000); L
TZ3r/
批量更新 d5fnJ*a>l
1、Statement C$SuFL(pb
Statement sm = cn.createStatement(); w<<>XIL
sm.addBatch(sql1); *?Nrx=O*
sm.addBatch(sql2); qxf!]jm
... _d76jmujJ
sm.executeBatch() 4Pe%*WTX
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Xa=oryDt
2、PreparedStatement )."_i64
PreparedStatement ps = cn.preparedStatement(sql); IP7j)SM!
{ ci0)kxUBF
ps.setXXX(1,xxx); D)U
9xA)J
... 9u ^PM
ps.addBatch(); {mrTpw
} So{/V%
ps.executeBatch(); BCYTlxC'
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 H=9kDP${
X0Y1I}gD
事务的处理 <qT[
1、关闭Connection的自动提交 -KhNsUQk
cn.setAutoCommit(false); uf]SPG#/D
2、执行一系列sql语句 ;{EIx*<d
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close =5/ow!u8
Statement sm ; [Ul"I-K
sm = cn.createStatement(insert into user...); >h1 3i@`r
sm.executeUpdate(); ug{@rt/"Z
sm.close(); .A<G$ db
?
sm = cn.createStatement("insert into corp...); c.dk4v%Y5
sm.executeUpdate(); 3u#bx1
sm.close(); (-Cxv`7
3、提交 7/+I"~
cn.commit(); Z^E>)!t
4、如果发生异常,那么回滚 7rQwn2XD{
cn.rollback();