java 数据库基本操作 AoOA.t6RVo
1、java数据库操作基本流程 ^r.CUhx)
2、几个常用的重要技巧: uSRhIKy
可滚动、更新的记录集 (xN1?qXB.
批量更新 $,]U~7S
事务处理 9(q(;|;Hp
d"miPR
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 kE.4 #
1、取得数据库连接 GM'yOJo
1)用DriverManager取数据库连接 K)wWqC.
例子 $-Ex
g*i
String className,url,uid,pwd; i>,AnkI&
className = "oracle.jdbc.driver.OracleDriver"; M-@X&bm,S
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; t"YsIOT:O"
uid = "system"; OR!W3
@
pwd = "manager"; CxjB9#
Class.forName(className); d6'G
7'9
Connection cn = DriverManager.getConnection(url,uid,pwd); {4,],0bjx/
2)用jndi(java的命名和目录服务)方式 /z4c>)fV
例子 `R:W5_n
String jndi = "jdbc/db"; CX{6
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Q2- lHn^L:
DataSource ds = (DataSource) ctx.lookup(jndi); @-L]mLY
Connection cn = ds.getConnection(); *j&)=8Y|
多用于jsp中 <\ <o#Vq
2、执行sql语句 rvy%8%e?
1)用Statement来执行sql语句 d[p2?]
String sql; Jj+Q2D:
Statement sm = cn.createStatement(); eBnx$
sm.executeQuery(sql); // 执行数据查询语句(select) @WS77d~S
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); T\bP8D
2)用PreparedStatement来执行sql语句 Z s=A<[
String sql; QwWd"Of
sql = "insert into user (id,name) values (?,?)"; k:run2K
PreparedStatement ps = cn.prepareStatement(sql); MkoK(m{7
ps.setInt(1,xxx); dB[4NT
ps.setString(2,xxx); ` qs}L
... 8I/3T
ResultSet rs = ps.executeQuery(); // 查询 -'d:~:1f
int c = ps.executeUpdate(); // 更新 ?@$xLUHR4
I
]ZZN6"
3、处理执行结果 rY45.,qWs
查询语句,返回记录集ResultSet XyE$0i~t
更新语句,返回数字,表示该更新影响的记录数 oH%[8!#
ResultSet的方法 rx2'].
1、next(),将游标往后移动一行,如果成功返回true;否则返回false >lUPOc
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 xt?-X%oY8
zG6l8%q'UE
4、释放连接 d7vPZ_j^z
cn.close(); ,.QJS6Yv
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection b~,e(D9DG
Zyz#xMmM
可滚动、更新的记录集 j@z IJ
1、创建可滚动、更新的Statement Mg`!tFe3
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); w/m@(EBK
该Statement取得的ResultSet就是可滚动的 K9k!P8Rd
2、创建PreparedStatement时指定参数 :IS?si5|
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); OLb s~
>VA
ResultSet.absolute(9000); OA3J(4!"W
批量更新 PO"lY'W.U
1、Statement ,7&\jET5^0
Statement sm = cn.createStatement(); p!YK~cH[
sm.addBatch(sql1); .<`)`:n+B
sm.addBatch(sql2); Z\CvaX
... M<w.q|P
sm.executeBatch() S"h;u=5it
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 KM?4J6jH
2、PreparedStatement Mc@9ivwL#
PreparedStatement ps = cn.preparedStatement(sql); z.cDbkf}
{ iX+8!>Q
ps.setXXX(1,xxx); <@.e.H
... '2r
ps.addBatch(); 3E|||3rf
} H:~p5t
ps.executeBatch(); V@`b7GM
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ;pW8a?
TI7$J#
事务的处理 Qt+D ,X
1、关闭Connection的自动提交 FQ<x(&/NF
cn.setAutoCommit(false); )-3~^Y#r_
2、执行一系列sql语句 ~{Iw[,MJ
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close
pRobx
Statement sm ; (WT\HR
sm = cn.createStatement(insert into user...); IEy$2f>Ns
sm.executeUpdate(); 2O=$[b3
sm.close(); OCx'cSs-=
sm = cn.createStatement("insert into corp...); }) -V,\
sm.executeUpdate(); ZwMVFC-d
sm.close(); crIF5^3Yby
3、提交 .Od:#(aq
cn.commit(); U7g`R@
4、如果发生异常,那么回滚 )4ek!G]Rb
cn.rollback();