java 数据库基本操作 -~\f2'Q
1、java数据库操作基本流程 BJgDo
2、几个常用的重要技巧: Xo8DEr
可滚动、更新的记录集 <}]{~y
批量更新 rd">JEK;;
事务处理 /K@$#x_{
.yX>.>"T|
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 eG4>d^`c
1、取得数据库连接 rFfy#e
1)用DriverManager取数据库连接 vf N#NY6
例子 &wb9_?ir-
String className,url,uid,pwd; !)nD xM`p
className = "oracle.jdbc.driver.OracleDriver"; [Y$V\h=V
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; d/lffNS=
uid = "system"; aHC%19UN
pwd = "manager"; 9T?64t<Ju
Class.forName(className); 5uttv:@=
Connection cn = DriverManager.getConnection(url,uid,pwd); r6MB"4xd
2)用jndi(java的命名和目录服务)方式 V_f`0\[x
例子 R1/q3x
String jndi = "jdbc/db"; GG+5/hU
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); m!:.>y
DataSource ds = (DataSource) ctx.lookup(jndi); P5Dk63z]
Connection cn = ds.getConnection(); AEqq1A
多用于jsp中 }PZ=`w*O
2、执行sql语句 79wLT\&
1)用Statement来执行sql语句 _ eiF@G
String sql; 8%-%AWF]
Statement sm = cn.createStatement(); 4w;~4#ZPp
sm.executeQuery(sql); // 执行数据查询语句(select) lLMPw}r<
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); #%8 w
2)用PreparedStatement来执行sql语句 g|4w8ry
String sql; nP;;MX:B
sql = "insert into user (id,name) values (?,?)"; "wINBya'M
PreparedStatement ps = cn.prepareStatement(sql); L+t[&1cW
ps.setInt(1,xxx); p[-{]!
ps.setString(2,xxx); k}U
JVH21k
... N+J>7_k
ResultSet rs = ps.executeQuery(); // 查询 HCazwX
int c = ps.executeUpdate(); // 更新 ul=7>";=|
;s}3e#$L
3、处理执行结果 (Q_2ODKo
查询语句,返回记录集ResultSet K$ AB} Fvc
更新语句,返回数字,表示该更新影响的记录数 "xn|zB
ResultSet的方法 LABNj{=D!
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Z/7dg-$?'0
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 I="oxf#q
${>DhfF
4、释放连接 Sr"/-
cn.close(); B9^R8|V
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection CV3DMA
lhxdx
可滚动、更新的记录集 s!de2z
1、创建可滚动、更新的Statement !W~<q{VTs
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); sOz sY7z3Z
该Statement取得的ResultSet就是可滚动的 I7zn>^0}
2、创建PreparedStatement时指定参数 ) Fx?%
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 3e
73l
ResultSet.absolute(9000); ZF'HM@cfo
批量更新 3Oiy)f@{TF
1、Statement 11{y}J
Statement sm = cn.createStatement(); )$_,?*fq:
sm.addBatch(sql1); )*D'csGc
sm.addBatch(sql2); W+hV9
... |!}wF}iLc)
sm.executeBatch() !M^\f
N1
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 !DcX8~~@
2、PreparedStatement +$,dwyI2t
PreparedStatement ps = cn.preparedStatement(sql); gt@SuX!@{^
{ Q1T@oxV
ps.setXXX(1,xxx); HTR1)b
... H#Q;"r 3
ps.addBatch(); bjzx!OCpV
} Bm}iU~(Z`
ps.executeBatch(); 6p m~sD
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 j|(:I: ]
TGpSulg7
事务的处理
W_}/ O'l{
1、关闭Connection的自动提交 '\t7jQ
cn.setAutoCommit(false); gQ+9xT d
2、执行一系列sql语句 ]nc2/S%
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ._,trb>o
Statement sm ; KTv4< c]
sm = cn.createStatement(insert into user...); FWY[=S
sm.executeUpdate(); sUciFAb
sm.close(); 'hIU_
sm = cn.createStatement("insert into corp...); +>#e=nH
sm.executeUpdate(); M5O'=\+,F
sm.close(); $eX*
3、提交 s5AgsMq
cn.commit(); 3+9
U1:1[.
4、如果发生异常,那么回滚 R@n5AN(
cn.rollback();