java 数据库基本操作 a
s?)6
1、java数据库操作基本流程 {W# VUB
2、几个常用的重要技巧: <~!R|5sK
可滚动、更新的记录集 '^6x-aeq[D
批量更新 {BJn9B
事务处理 tJY3k$YX
3/((7O[
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 a<`s'N1G
1、取得数据库连接 7j L.\O
1)用DriverManager取数据库连接 iYxpIqWw
例子 zINziAp{
String className,url,uid,pwd; .EoLJHL
}
className = "oracle.jdbc.driver.OracleDriver"; rwou[QU
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; u~^d5["T
uid = "system"; Tj*Vk $}0
pwd = "manager"; >)PcK
Class.forName(className); 6o/!H
Connection cn = DriverManager.getConnection(url,uid,pwd); _!*??B6u
2)用jndi(java的命名和目录服务)方式 U:
Q&sq8U
例子 ep2#a#&'
String jndi = "jdbc/db"; ]p2M!N,?
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); A5> ,e|
DataSource ds = (DataSource) ctx.lookup(jndi); =m?x|Zc_v
Connection cn = ds.getConnection(); 42: 6=\
多用于jsp中 WwM/M!98J
2、执行sql语句 YAf`Fnmw
1)用Statement来执行sql语句 XZFM|=%X
String sql; tZ]/?+1G
Statement sm = cn.createStatement(); ,s,VOyr @F
sm.executeQuery(sql); // 执行数据查询语句(select) 4U;6 2 jq
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); kW@,P.88
2)用PreparedStatement来执行sql语句 U&\8~h
String sql; GwoN=
sql = "insert into user (id,name) values (?,?)"; g"iLhm`L
PreparedStatement ps = cn.prepareStatement(sql); fc#zhp5bX
ps.setInt(1,xxx); *g<D p2`
ps.setString(2,xxx); sSMcF[]@2I
...
5 5_#?vw
ResultSet rs = ps.executeQuery(); // 查询 MZX-<p+
int c = ps.executeUpdate(); // 更新 /i#~#Bn|
X^U)j
N2
3、处理执行结果 CcZ\QOet&C
查询语句,返回记录集ResultSet 6:(*u{
更新语句,返回数字,表示该更新影响的记录数 5@6%/='I q
ResultSet的方法 [y}0X^9,E
1、next(),将游标往后移动一行,如果成功返回true;否则返回false n~g,qEI;<x
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ;U=RV&
yqm^4)Dp
4、释放连接 8_S<zE`Ha
cn.close(); x05yU
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection L)cy&"L|
q7
;TdQ
可滚动、更新的记录集 Q}N.DM@d3
1、创建可滚动、更新的Statement #l6L7u0~wC
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 8()L }@y
该Statement取得的ResultSet就是可滚动的 y^#jM
2、创建PreparedStatement时指定参数 4{h?!Z*
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); q#$4Kt;
ResultSet.absolute(9000); F(- Q]xj,
批量更新 n y7G
1、Statement xbFoXYqgP
Statement sm = cn.createStatement(); ,iXE3TN;W
sm.addBatch(sql1); ]E1aIt
sm.addBatch(sql2); p#9.lFSX
... /Ot=GhN]
sm.executeBatch() <|_/i/H
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 aN7VGc
2、PreparedStatement x: `]uOp
PreparedStatement ps = cn.preparedStatement(sql); 7(m4,l+(
{ $z!o&3c'x
ps.setXXX(1,xxx); QfuKpcT&
... Kf<-PA
ps.addBatch(); E>tlY&0[$
} ;F@N2j#
ps.executeBatch(); #:{Bd8PS
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 rzH*| B0g
pJC@}z^cw
事务的处理 x[+t
1、关闭Connection的自动提交 N4$!V}pp
cn.setAutoCommit(false); bDa(@QJ-
2、执行一系列sql语句 c7mIwMhl~
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close X6jW mo8]
Statement sm ; [HJ^'/bB'
sm = cn.createStatement(insert into user...); #>+O=YO
sm.executeUpdate(); )GDP?Nc<Ik
sm.close(); nYJ)M
AG@
sm = cn.createStatement("insert into corp...); p/|]])2
sm.executeUpdate(); cD&53FPXC
sm.close(); uXiAN#1
3、提交 ^YddVp
cn.commit(); \IL/?J
5d
4、如果发生异常,那么回滚 @EZ@X/8{&
cn.rollback();