java 数据库基本操作 30<_`
1、java数据库操作基本流程 ^])s\a$
2、几个常用的重要技巧: |v<4=/.
可滚动、更新的记录集 ,t!I%r
批量更新 m}f{o
事务处理 !3{.
V\P)
d$8K,-M
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 u>:j$@56
1、取得数据库连接 +O)ZB$w4
1)用DriverManager取数据库连接 a5&[O
例子 A-*MH#QUKh
String className,url,uid,pwd; )-h{0o
className = "oracle.jdbc.driver.OracleDriver"; 7I*rtc&Kb
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; N4b{^JkF
uid = "system"; DR]4Tc z#
pwd = "manager"; S]A[eUF~
Class.forName(className); vQj{yJ\l1
Connection cn = DriverManager.getConnection(url,uid,pwd); &*oljGt8
2)用jndi(java的命名和目录服务)方式 q\<NW%KtX
例子 [ua[A;K
String jndi = "jdbc/db"; V{~~8b1E
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); c7R&/JV
DataSource ds = (DataSource) ctx.lookup(jndi); c=^69>w
Connection cn = ds.getConnection(); BU7QK_zT:
多用于jsp中 h)aLq
2、执行sql语句 k=G c#SD5_
1)用Statement来执行sql语句 nU 0##
String sql;
@H^\PH?pp
Statement sm = cn.createStatement(); x=X&b%09
sm.executeQuery(sql); // 执行数据查询语句(select) r?dkE=B
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); bR$5G
2)用PreparedStatement来执行sql语句 J%
ZM
V
String sql; F5OQM?J
sql = "insert into user (id,name) values (?,?)"; 0_,un^
PreparedStatement ps = cn.prepareStatement(sql); {bG. X?b
ps.setInt(1,xxx); :&LV^A
ps.setString(2,xxx); "ZA`Lp;%w
... O&}R
ResultSet rs = ps.executeQuery(); // 查询 :a:m>S<~
int c = ps.executeUpdate(); // 更新 LR'~:46#u
,Ek6X)|@
3、处理执行结果 19RbIG/X
查询语句,返回记录集ResultSet b@sq}8YD|z
更新语句,返回数字,表示该更新影响的记录数 \Ym!5,^o
ResultSet的方法 AP8J28I
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 6j!a*u:}"
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ;iJ}[HUo
ywB0
D`s'
4、释放连接 h 0)oQrY
cn.close(); NRk^Z)
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection O;T)u4Q&3
%eGD1.R
可滚动、更新的记录集 M'oQ<,yW-
1、创建可滚动、更新的Statement Xn5LrLM&
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); c{39,oF
该Statement取得的ResultSet就是可滚动的 ]7RK/Zu i
2、创建PreparedStatement时指定参数 nA%8
bZ+
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); XpA|<s
ResultSet.absolute(9000); &)|f|\yh"
批量更新 k^K%."INn
1、Statement uKB V`I
Statement sm = cn.createStatement(); :qV|rih_Q
sm.addBatch(sql1); >SS^qjh/
sm.addBatch(sql2); A0Q1"b=
... J7~Kjl
sm.executeBatch() =$ubSfx
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 NxB/U_j
2、PreparedStatement ;=@?( n
PreparedStatement ps = cn.preparedStatement(sql); }uO2x@
{ 4{b/Nv:b
ps.setXXX(1,xxx); v+dT7*^@
... ha9 dz
ps.addBatch(); (C%qA<6
} t+j dV
ps.executeBatch(); NH1ak(zHW
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 y5Fgf3P@ju
LmUR@
/VQ
事务的处理 ,S~A]uH'
1、关闭Connection的自动提交 A5O; C
cn.setAutoCommit(false); jO`L:D/C
2、执行一系列sql语句 vkW;qt}yO
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 'C;KNc
Statement sm ; r4iT
9D
sm = cn.createStatement(insert into user...); ZW
5FL-I
sm.executeUpdate(); nE:Wl
sm.close(); =,08D^ xY
sm = cn.createStatement("insert into corp...); Tc|+:Usy
sm.executeUpdate(); %;J$ h^
sm.close(); ?3i<^@?
3、提交 5"+;}E|q
cn.commit(); dbF9%I@
4、如果发生异常,那么回滚 5j _[z|W2
cn.rollback();