java 数据库基本操作 F$ckW'V
1、java数据库操作基本流程 !D!"ftOm
2、几个常用的重要技巧: 3:<[;yo
可滚动、更新的记录集 F-XMy>9
批量更新 *^KEb")$
事务处理 <sn,X0W
fZ(k"*\MZ
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 XP[~ :+
1、取得数据库连接 r?9".H
1)用DriverManager取数据库连接 3e>U(ES
例子 .e4upTGU
String className,url,uid,pwd; +i[@+`
className = "oracle.jdbc.driver.OracleDriver"; ,Iru_=Wk~
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; dkW7k^g
uid = "system"; pgW^hj\
pwd = "manager"; %jJIR88
Class.forName(className); Q9c*I,Oj
Connection cn = DriverManager.getConnection(url,uid,pwd); N/[!$B0H@
2)用jndi(java的命名和目录服务)方式 nbW.x7
例子 \~r_S
String jndi = "jdbc/db"; 8?rq{&$t
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); |n;5D,r0C
DataSource ds = (DataSource) ctx.lookup(jndi); If8Lt}-
Connection cn = ds.getConnection(); ]z]=?;ty%
多用于jsp中 /z(d!0_q|v
2、执行sql语句 Jpy~5kS
1)用Statement来执行sql语句 %_G '#Bn<
String sql; mz<X$2]?
Statement sm = cn.createStatement(); Y-,S_59
sm.executeQuery(sql); // 执行数据查询语句(select) :QF`Orb!^
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); KpIY>k
2)用PreparedStatement来执行sql语句 0d$LUQ't
String sql; h*Mt{A&'.&
sql = "insert into user (id,name) values (?,?)"; s`pdy$
PreparedStatement ps = cn.prepareStatement(sql); R2Lq??XA=
ps.setInt(1,xxx); aU/y>Y <k
ps.setString(2,xxx); B 74
... 2&=CC4<!d
ResultSet rs = ps.executeQuery(); // 查询 %q.5;L
int c = ps.executeUpdate(); // 更新 6\Tq,I7
B`w8d[cL7
3、处理执行结果 a|DCpU}
查询语句,返回记录集ResultSet IpM"k)HR
更新语句,返回数字,表示该更新影响的记录数 )NTpb
ResultSet的方法 XjmAM/H4
1、next(),将游标往后移动一行,如果成功返回true;否则返回false eep/96G
?
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 %TO&
VF +g+~
4、释放连接 q^uCZnkb=
cn.close(); NZlCn:"
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection a
p( PI?]X
'*EKi
可滚动、更新的记录集 [x-
9m\h
1、创建可滚动、更新的Statement Y5P9z{X=
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ERIF#EY
该Statement取得的ResultSet就是可滚动的 WqS$C;]%
2、创建PreparedStatement时指定参数 rCb$^(w{7
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); (!?%"e
ResultSet.absolute(9000); 3HNm`b8G4m
批量更新 i~3\dp
1、Statement brK7|&R<
Statement sm = cn.createStatement(); b&]z^_m)
sm.addBatch(sql1); @1qdnU
sm.addBatch(sql2); Nfv`
)n@
... .krEfY&
sm.executeBatch() LoOw]@>
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 z@~mu
2、PreparedStatement
bM }zGFt
PreparedStatement ps = cn.preparedStatement(sql); mRt/d
{ ` +)Bl%*
ps.setXXX(1,xxx); jk Aru_C
... `=Rxnl,<U
ps.addBatch(); =`2jnvx
} +Y2D @K?)
ps.executeBatch(); : GFK
|
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 0g
Hd{H=
Zqv
事务的处理 yTNHM_P
1、关闭Connection的自动提交 B,` `2\B
cn.setAutoCommit(false); 69t6lB#;!
2、执行一系列sql语句 \^!<Y\\
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close -FrK'!\
Statement sm ; uZ+"-Ig
sm = cn.createStatement(insert into user...); &i6JBZ#~,
sm.executeUpdate(); aCi)icn$
sm.close(); mR|']^!SE
sm = cn.createStatement("insert into corp...); Y1F%-o
sm.executeUpdate(); I|2dV9y
sm.close();
Y=H_U$
3、提交 9j}Q~v\
cn.commit(); ) r"7" i
4、如果发生异常,那么回滚 9JeT1\VvHY
cn.rollback();