java 数据库基本操作 yyljyE
1、java数据库操作基本流程 vG'#5%,|
2、几个常用的重要技巧: 8Th,C{
可滚动、更新的记录集 KUYwc@si\
批量更新 Z#Kf%x.
事务处理 5 ,-8oEUL
HUD0
@HQI
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 J<+f7L
1、取得数据库连接 =?0v,;F9|
1)用DriverManager取数据库连接 hHmm(~5gR
例子 R'`'q1=R
String className,url,uid,pwd; RZV6;=/
className = "oracle.jdbc.driver.OracleDriver"; *E/ Mf
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; f$\O:E=
uid = "system"; &K60n6q{aQ
pwd = "manager"; ssx#|InY
Class.forName(className); 3: WEODV2
Connection cn = DriverManager.getConnection(url,uid,pwd); ,lA@C2c
2)用jndi(java的命名和目录服务)方式 OqIXFX"
例子 eK
l;T
String jndi = "jdbc/db"; Ad>81=Z
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ih/E,B"
DataSource ds = (DataSource) ctx.lookup(jndi); / @"{u0
Connection cn = ds.getConnection(); Q17dcgd
多用于jsp中 |@'O3KA
2、执行sql语句 a{r"$>0
1)用Statement来执行sql语句 r9&m^,U
String sql; yD7}
Statement sm = cn.createStatement(); x1#>"z7
sm.executeQuery(sql); // 执行数据查询语句(select) Nz.X$zUmY
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Rr%x;-
2)用PreparedStatement来执行sql语句 m!Z<\2OP
String sql; O 1z0dHa
sql = "insert into user (id,name) values (?,?)"; =xIZJ8e
PreparedStatement ps = cn.prepareStatement(sql); jhf3(hx&F
ps.setInt(1,xxx); 9/29>K_
ps.setString(2,xxx); PjEJC@n
... 1J"9Y81
ResultSet rs = ps.executeQuery(); // 查询 $Q8
&TM}E
int c = ps.executeUpdate(); // 更新 $ch`.$wx
hI!BX};+}
3、处理执行结果 ]}N01yw|s
查询语句,返回记录集ResultSet F""9O6u
更新语句,返回数字,表示该更新影响的记录数 $~.YB\3
ResultSet的方法 }q@#M8 b
1、next(),将游标往后移动一行,如果成功返回true;否则返回false i,*m(C@F}
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ]<f(@]R/d
C$6FI`J
4、释放连接 <A)M^,#o
cn.close(); *PnO$q@`
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 8]&:'
c**&, aL
可滚动、更新的记录集 y0mNDze
1、创建可滚动、更新的Statement Q l)hIf$Oo
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); `e
=IXkt
该Statement取得的ResultSet就是可滚动的 B ??07j
2、创建PreparedStatement时指定参数 4)8VmCW
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); A)sYde(
ResultSet.absolute(9000); (^
EuF]
批量更新 N5=BjXSAg
1、Statement rnj$u-8
Statement sm = cn.createStatement(); u3+B/ 5x
sm.addBatch(sql1); 6EyPZ{
sm.addBatch(sql2); ZK^cG'^2|
... 0,t%us/q
sm.executeBatch() X>o9mW
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 H/*ol^X7
2、PreparedStatement Tl2t\z+ps
PreparedStatement ps = cn.preparedStatement(sql); )/::i
O&$:
{ j
%gd:-tA
ps.setXXX(1,xxx); +_i{4Iz~p
... +n;nvf}(
ps.addBatch(); @h{|tP%"
} f<@!{y2Xe
ps.executeBatch(); ^-~JkW'z
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Om0$6O
zW%Em81Wd
事务的处理 bJ!\eI%ld
1、关闭Connection的自动提交 JyMk @Y
cn.setAutoCommit(false); EYq?NL='
2、执行一系列sql语句 [UzD3VPg
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ~#*C,4m
Statement sm ; 8O,\8:I#
sm = cn.createStatement(insert into user...); Yao}Xo9}
sm.executeUpdate(); f?sm~PwC-
sm.close(); R}Lk$#S#
sm = cn.createStatement("insert into corp...); >J:=)1`
sm.executeUpdate(); 4Lt9Dx1
sm.close(); /=/Ki%hh
3、提交 )FQ"l{P
cn.commit(); @=VxWU
4、如果发生异常,那么回滚 M-"j8:en
cn.rollback();