java 数据库基本操作 WbGN
5?9Q
1、java数据库操作基本流程 HB,
k}Q
2、几个常用的重要技巧: h4tAaPcS+
可滚动、更新的记录集 LuvRxmQ`
批量更新 Og<nnq
事务处理 A_2oQ*
L<Q>:U.@\
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 )GR4U8<>g
1、取得数据库连接 TcOmBKps'
1)用DriverManager取数据库连接 @y(<4kLz
例子 CC,CKb
String className,url,uid,pwd; DgODTxiX
className = "oracle.jdbc.driver.OracleDriver"; 4Bk9d\z
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; C(}N*e1
uid = "system"; w=QW8q?
pwd = "manager"; KYR64[1
Class.forName(className); :Hq#co
Connection cn = DriverManager.getConnection(url,uid,pwd); Ih^ziDcW
2)用jndi(java的命名和目录服务)方式 Q<T+t0G\O-
例子 Uq^-km#a
String jndi = "jdbc/db"; L'r gCOJ<
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); UB,:won
DataSource ds = (DataSource) ctx.lookup(jndi); a}[ 1*_G
Connection cn = ds.getConnection(); !30BR|K*
多用于jsp中 T[ltOQw?Y
2、执行sql语句 PAS0 D
#
1)用Statement来执行sql语句 u_jhmKr~
String sql; 4#lOAzDtv
Statement sm = cn.createStatement(); 4}Dfi5:
sm.executeQuery(sql); // 执行数据查询语句(select) pFcCe
'd"
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); DLd1Cl:"~:
2)用PreparedStatement来执行sql语句 mY&(&'2T"
String sql; 0{qe1pb w
sql = "insert into user (id,name) values (?,?)"; ZiaHLpk
PreparedStatement ps = cn.prepareStatement(sql); 0YO/G1O&
ps.setInt(1,xxx); &%r<_1
ps.setString(2,xxx); ]? %*3I
... ]?lUe5F
ResultSet rs = ps.executeQuery(); // 查询 rObg:(z&\
int c = ps.executeUpdate(); // 更新 qaiR329fx
,_z"3B)]
3、处理执行结果 dzs(sM=
查询语句,返回记录集ResultSet #H.DnW
更新语句,返回数字,表示该更新影响的记录数 A^vvw~!d
ResultSet的方法 T&+y~c[au
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 36UUt!}p
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 U5yBU9\G
T,/:5L9
4、释放连接 =:_DXGW2H
cn.close(); 9y?)Ga
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection odhcU5
wf2v9.;X:<
可滚动、更新的记录集 &NH[b1NMr
1、创建可滚动、更新的Statement u#nM_UJe
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); uUJH^pW
该Statement取得的ResultSet就是可滚动的 /Suh&qw>
2、创建PreparedStatement时指定参数 nR8r$2B+t
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 8 DPn5E#M1
ResultSet.absolute(9000); 1C+d&U
批量更新 Z7dyPR
1、Statement U# U*^#
Statement sm = cn.createStatement(); OCEhwB0
sm.addBatch(sql1); U?=-V8#M|
sm.addBatch(sql2); ;VS$xnZ
... +d=w%r)
sm.executeBatch() [Zne19/
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 k\Z7Dg$\D
2、PreparedStatement :%>TM/E N
PreparedStatement ps = cn.preparedStatement(sql); ~_a$5Y
{ cf,^7,-`"
ps.setXXX(1,xxx); A5go)~x\
... dU&hM<.|
ps.addBatch(); 98XlcI#
} 7x#."6>Dy
ps.executeBatch(); i,!t u
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Kp>fOe'KW
#oJ%i+V
事务的处理 =[LUOOR*]
1、关闭Connection的自动提交 }6!m Q
cn.setAutoCommit(false); _~bG[lX !
2、执行一系列sql语句 tL]T_]z
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close P(aN6)D
Statement sm ; ;k
(M4?
sm = cn.createStatement(insert into user...); @ RP?)*8}&
sm.executeUpdate(); @:t2mz:^i
sm.close(); L~E|c/
sm = cn.createStatement("insert into corp...); n;e.N:p
sm.executeUpdate(); sFw;P`
sm.close(); [oOV@GE
3、提交 a/xnf<(H
cn.commit(); N#GMvU#R
4、如果发生异常,那么回滚 5#~E[dr
cn.rollback();