java 数据库基本操作 y*6/VSRkt4
1、java数据库操作基本流程 *>1^q9M
2、几个常用的重要技巧: 't5`Ni
可滚动、更新的记录集 _x|.\j
批量更新 YPf?
事务处理 `b%lojT.
1X&jlD?
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 4 Tw~4b
1、取得数据库连接 >[;=c0(
1)用DriverManager取数据库连接 $*T?}r>
例子 C,GZ
String className,url,uid,pwd; t,IOq[Vtk
className = "oracle.jdbc.driver.OracleDriver"; }lT;?|n:h
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; .{} 8mFi1
uid = "system"; qZ&~&f|>e
pwd = "manager"; i];P!Gm
Class.forName(className); @BF1X.4-+
Connection cn = DriverManager.getConnection(url,uid,pwd); KROD(
2)用jndi(java的命名和目录服务)方式 |"I)1[7
例子 yMTO 5~U{
String jndi = "jdbc/db"; S(?A3 H
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); [[zNAq)"
DataSource ds = (DataSource) ctx.lookup(jndi); _SJ:|I
Connection cn = ds.getConnection(); Jazg n5
多用于jsp中 A.dbb'^
2、执行sql语句 :tI
F*pC
1)用Statement来执行sql语句 R&a$w8
String sql; {]Hv*{ ]
Statement sm = cn.createStatement(); a@d 15CN
sm.executeQuery(sql); // 执行数据查询语句(select) 9dBxCdpu
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Lj9RF<39g
2)用PreparedStatement来执行sql语句 t(9q6x3|e
String sql; }m~MN4 l
sql = "insert into user (id,name) values (?,?)"; @un+y9m[C
PreparedStatement ps = cn.prepareStatement(sql); Q2uV/M1?
ps.setInt(1,xxx); 5j6`W?|q
ps.setString(2,xxx); e}S+1G6r)
... f'H|K+bO
ResultSet rs = ps.executeQuery(); // 查询 >]z^.U7=
int c = ps.executeUpdate(); // 更新 d7
H *F
/XEW]/4
3、处理执行结果 ^|]Dg &N.
查询语句,返回记录集ResultSet ~x#TfeU]
更新语句,返回数字,表示该更新影响的记录数 x3Y)l1gh
ResultSet的方法 b*M?\ aA
1、next(),将游标往后移动一行,如果成功返回true;否则返回false tiHR&v
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 q$mc{F($D
]z/R?SM
4、释放连接 I
"~.p='
cn.close(); |K06H
?6X
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection j7k}!j_O{
X<P
<-e9
可滚动、更新的记录集 x|(pmqIH+
1、创建可滚动、更新的Statement \ "$$c
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); {G VA4=UAE
该Statement取得的ResultSet就是可滚动的 s&(;
2、创建PreparedStatement时指定参数 y,3ZdY"
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); kuV7nsXiQ
ResultSet.absolute(9000); ``Q6R2[|)
批量更新 fyA-*)oHv
1、Statement kMMgY?
Statement sm = cn.createStatement(); }Mt1C~{(
sm.addBatch(sql1); 7K:V<vX5
sm.addBatch(sql2); HP1QI/*v
... I4{xQI
sm.executeBatch() Cul=,;pkB
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 \/o$io,kV
2、PreparedStatement #c>GjUJ.w
PreparedStatement ps = cn.preparedStatement(sql); @XV&^l-
{ ACdPF_Y]
ps.setXXX(1,xxx); 6AGZ)gX
... hN
&?x5aC>
ps.addBatch(); Bhd)# P
} -` U|5
ps.executeBatch(); EZ]4cd/i
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 EN2SI+
U5OX.0
事务的处理 pUb1#=
1、关闭Connection的自动提交 <78|~SKAV
cn.setAutoCommit(false); _wS=*-fT
2、执行一系列sql语句 (^m]
7l
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 0!_?\)X
Statement sm ; #e|o"R;/`
sm = cn.createStatement(insert into user...); 2 HEU
sm.executeUpdate(); dD=$$(
je
sm.close(); ?<TJ}("/
sm = cn.createStatement("insert into corp...); 49$<:{ ~
sm.executeUpdate(); 7upko9d/
sm.close(); h@!p:]
3、提交 hx$61E=
cn.commit(); 7GYf#} N
4、如果发生异常,那么回滚 :^v Q4/,
cn.rollback();