java 数据库基本操作 AiDV4lHr
1、java数据库操作基本流程 @nNhW
2、几个常用的重要技巧: W]TO%x{
可滚动、更新的记录集 Id(wY$C&>
批量更新 HNMVs]/e
事务处理 P&g.%8b~84
n1E^8[~'
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 bdxmJ9a:R
1、取得数据库连接 L/+KY_b:*
1)用DriverManager取数据库连接 s7
K](T4
例子 B*
hW
String className,url,uid,pwd; q@@C|oqEX
className = "oracle.jdbc.driver.OracleDriver"; P}2waJe
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; [(81-j1v
uid = "system"; gK%^}xU+
pwd = "manager"; !et[Rdbu
Class.forName(className); qX_(
M2oLU
Connection cn = DriverManager.getConnection(url,uid,pwd); <H]1 6
2)用jndi(java的命名和目录服务)方式 +G.F'
例子 RZL:k;}5
String jndi = "jdbc/db"; +`(,1L1
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); $qp,7RW
DataSource ds = (DataSource) ctx.lookup(jndi); _v\L'`bif
Connection cn = ds.getConnection(); (\qO~)[0
多用于jsp中 HLruZyN4
2、执行sql语句 9) ~Ha iVB
1)用Statement来执行sql语句 gX'nFGqud
String sql; 5 0KB:1(g
Statement sm = cn.createStatement(); OS{j5o
sm.executeQuery(sql); // 执行数据查询语句(select) f8AgTw,K8
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 4k6,pt"
2)用PreparedStatement来执行sql语句 =X24C'!Mpe
String sql; 4UV6'X)V
sql = "insert into user (id,name) values (?,?)"; S!J wF&EW
PreparedStatement ps = cn.prepareStatement(sql); uK!G-1
ps.setInt(1,xxx); y5!fbmf
ps.setString(2,xxx); m|8ljXX
... L2WH-XP=
ResultSet rs = ps.executeQuery(); // 查询 9{(A-
int c = ps.executeUpdate(); // 更新 DtRu&>o_6D
s0/[mAY
3、处理执行结果 Wf>P[6
查询语句,返回记录集ResultSet O\z]1`i*o
更新语句,返回数字,表示该更新影响的记录数 =)O%5<Lwx
ResultSet的方法 Y5&mJp\G
1、next(),将游标往后移动一行,如果成功返回true;否则返回false o)U4RY*
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ^ALR.N+<
6~O9|s^38w
4、释放连接 /l.ox.4z#
cn.close(); &}+^*X
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection caC-JcDXy
{wS)M
可滚动、更新的记录集 }iBFo\vU
1、创建可滚动、更新的Statement #CcC& I
:c
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); w1q`
该Statement取得的ResultSet就是可滚动的 b$,~S\\c
2、创建PreparedStatement时指定参数 >`S $(f
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ~L55l2u7
ResultSet.absolute(9000); <5fb,@YN
批量更新 MzP
q(`W
1、Statement ^:Hx .
Statement sm = cn.createStatement(); 'G|M_ e
sm.addBatch(sql1); !7fL'
sm.addBatch(sql2); 1SY`V?cu
... 8
mFy9{M
sm.executeBatch() <,\Op=$l3I
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 NW
AT"
2、PreparedStatement L^b /+R#
PreparedStatement ps = cn.preparedStatement(sql); R32A2Ml
{ KN\*|)
ps.setXXX(1,xxx); #J_+
SL[
... !\(j[d#
ps.addBatch(); %7vjYvo>
} Jp#Onl+d6
ps.executeBatch(); J6s@}@R1
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ZPO+ #,
$eQf 5)5
事务的处理 [.[|rnil
1、关闭Connection的自动提交 -,Y[`(q
cn.setAutoCommit(false); $bdtiD
2、执行一系列sql语句 \]7i-[
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 3Gyw^_{J
Statement sm ; %k8H'w\
sm = cn.createStatement(insert into user...); A&8{0
sm.executeUpdate();
,fR /C
sm.close(); n5e1ky*9w
sm = cn.createStatement("insert into corp...); UU;U,q
sm.executeUpdate(); ab/^z0GT
sm.close(); t_\;G~O9-M
3、提交 *41
2)zEy
cn.commit(); 6&qT1nF1
4、如果发生异常,那么回滚 Kx<T;iJ}
cn.rollback();