java 数据库基本操作 jTtu0Q|
1、java数据库操作基本流程 b;W3j
2、几个常用的重要技巧: &4x}ppX
可滚动、更新的记录集 0#s"e}@v
批量更新 'ud{m[|
事务处理 x$.^"l-vX
5o'FS{6U
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 yT"Eq"7/Y#
1、取得数据库连接 '/n1IM$7
1)用DriverManager取数据库连接 ;yLu R
例子 l<LP&
String className,url,uid,pwd; (!7sE9rP
className = "oracle.jdbc.driver.OracleDriver"; "W7K"=X
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; bL+_j}{:N
uid = "system"; RSyUaA
pwd = "manager"; y@: h4u"3
Class.forName(className); r,1!?s^L
Connection cn = DriverManager.getConnection(url,uid,pwd); }mYx_=+VX
2)用jndi(java的命名和目录服务)方式 )D5"ap]fX
例子 $m{:C;UH
String jndi = "jdbc/db"; )@l%
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); BB!THj69a6
DataSource ds = (DataSource) ctx.lookup(jndi); j<99FW"@e
Connection cn = ds.getConnection(); fo#fg8zX%
多用于jsp中 BxWPC#5
2、执行sql语句 HU8900k+
1)用Statement来执行sql语句 n,V[eW#m'L
String sql; c"n\cNP<
Statement sm = cn.createStatement(); t~EPn.
sm.executeQuery(sql); // 执行数据查询语句(select) ]7F=u!/`<C
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); r4XK{KHn
2)用PreparedStatement来执行sql语句 %Ycy{`
String sql; qn<|-hA*
sql = "insert into user (id,name) values (?,?)"; R'bTN|Cq
PreparedStatement ps = cn.prepareStatement(sql); +\c5]`
ps.setInt(1,xxx); k}kQI~S9
ps.setString(2,xxx); +mmSfuO&\
... 3G)#5Lf<
ResultSet rs = ps.executeQuery(); // 查询 7uS~MW
int c = ps.executeUpdate(); // 更新 ?GoR^p #p
l|~A#kq
3、处理执行结果 rb2S7k0{
查询语句,返回记录集ResultSet Jr
,;>
更新语句,返回数字,表示该更新影响的记录数 D3Ig>gKo?m
ResultSet的方法 ug!s7fo^
1、next(),将游标往后移动一行,如果成功返回true;否则返回false J6s`'gFns
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 qo90t{|c
'KS,'%
4、释放连接 nQX:T;WL@
cn.close(); z0p*Z&
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection hk(ZM#Bh
6Z6'}BDP
可滚动、更新的记录集 1EO7H{E=
1、创建可滚动、更新的Statement pMx*F@&nU
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); I {S;L
该Statement取得的ResultSet就是可滚动的 b9KP( _
2、创建PreparedStatement时指定参数 HZzD VCU
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); G_3O]BMKd)
ResultSet.absolute(9000); iZ3IdiZ
批量更新 /7nb,!~~l
1、Statement 3nIU1e
Statement sm = cn.createStatement(); fo*2:?K&
sm.addBatch(sql1); +eWQa`g
sm.addBatch(sql2); q#Z@+(^
... J{p1|+h%
sm.executeBatch() 6y%qVx#!
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 g2LM_1\
2、PreparedStatement pXT4)JDpc
PreparedStatement ps = cn.preparedStatement(sql); ^pAAzr"hv
{ N
,'GN[s
ps.setXXX(1,xxx); %Q__!D[
...
{7"Q\
ps.addBatch(); d6?j`~[7#-
} f}#~-.NGs
ps.executeBatch(); ??-[eB.
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 <y2U3;t
(^8Y|:Tz
事务的处理 ~ drS} V
1、关闭Connection的自动提交 P_dCR
cn.setAutoCommit(false); u<7/0;D#+
2、执行一系列sql语句 }l(&}#dY
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close #l\=}#\1Wb
Statement sm ; =t#llgi~
sm = cn.createStatement(insert into user...); 'NXN& {
sm.executeUpdate(); ?/wm (uL
sm.close(); )0.kv2o.
sm = cn.createStatement("insert into corp...); }>pknc?
sm.executeUpdate(); 8O5s`qKMYT
sm.close(); ]}<}lI9
3、提交 fIx+ILs
cn.commit(); 4x=v?g&
4、如果发生异常,那么回滚 %B2'~|g
cn.rollback();