java 数据库基本操作 f6Lc"b3s1
1、java数据库操作基本流程 GAZRQ
2、几个常用的重要技巧: >;R`Q9s7
可滚动、更新的记录集 :zq Un&k&
批量更新 /U0Hk>$~(
事务处理 |)" y
uv8kea .(
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 +P Dk>PdEt
1、取得数据库连接 ^IyQzBOj
1)用DriverManager取数据库连接 HV-;?5
例子 I8% -ii
String className,url,uid,pwd; WTM
className = "oracle.jdbc.driver.OracleDriver"; eThFRU3 F
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Nnr[@^M5
uid = "system"; "Nb2[R
pwd = "manager"; BfCnyL%
Class.forName(className); _ `O",Ff
Connection cn = DriverManager.getConnection(url,uid,pwd); 4b((,u$
2)用jndi(java的命名和目录服务)方式 @"A
5yD5
例子 WT")tjVKA
String jndi = "jdbc/db"; _|cSXZ|
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); TQ:5@1aT
DataSource ds = (DataSource) ctx.lookup(jndi); %3"3V1
Connection cn = ds.getConnection(); "C&>$h_%
多用于jsp中 LwxJ:Kz.
2、执行sql语句 bvrXz-j
1)用Statement来执行sql语句 - 0q263z
String sql; _9H]:]1QH
Statement sm = cn.createStatement(); d>W#c8X>
sm.executeQuery(sql); // 执行数据查询语句(select) {.p;V
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ,c$tKj5ulQ
2)用PreparedStatement来执行sql语句 [Gv8Fn/aG
String sql; !g6=/9
sql = "insert into user (id,name) values (?,?)"; mMOgx
PreparedStatement ps = cn.prepareStatement(sql); XP0;Q;WF}
ps.setInt(1,xxx); R@s|bs?
ps.setString(2,xxx); i+in?!@G:
... a^|9rho<
ResultSet rs = ps.executeQuery(); // 查询 qyFeq])
int c = ps.executeUpdate(); // 更新 4c{j9mh
]0 = |?n$7
3、处理执行结果 o<txm ?+N
查询语句,返回记录集ResultSet ,H,[)8
更新语句,返回数字,表示该更新影响的记录数
f+!J1
ResultSet的方法 Y?7GFkIP$
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ~av#r=x
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 jO5R ~O`
l0URJRK{*
4、释放连接 4X7J~
cn.close(); a#i|)[
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection + 9|0\Q
00f'G2n
可滚动、更新的记录集 .5!`wwVi
1、创建可滚动、更新的Statement ,7:-V<'Yv
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ]s^+/8d=
该Statement取得的ResultSet就是可滚动的 Vy[xu$y
2、创建PreparedStatement时指定参数 (ER9.k2
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); }F/w34+;
ResultSet.absolute(9000); >B~?
}@^Gk
批量更新 53ZbtEwhwr
1、Statement <82&F
Statement sm = cn.createStatement(); e1E_$oJP
sm.addBatch(sql1); F=w:!tqA
sm.addBatch(sql2); kZ)}tA7j
... WFV'^-4
sm.executeBatch() *` wz
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 nw+^@|4
2、PreparedStatement C96*,.j~'
PreparedStatement ps = cn.preparedStatement(sql); 0A~UuH0.
{ 3(|,:"9g
ps.setXXX(1,xxx); $N}t)iA
...
~/)]`w
ps.addBatch(); dI%ho<zm]
} ma@V>*u
ps.executeBatch(); #qF1z}L(
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 =Hn--DEMg
/3^XJb$Sa
事务的处理 iymN|KdpaZ
1、关闭Connection的自动提交 5p}j{f
cn.setAutoCommit(false); |4
\2,M#
2、执行一系列sql语句 4r~K`)/S'
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close yvzH}$!]
Statement sm ; 1W\wIj.
sm = cn.createStatement(insert into user...); Iy4%,8C]g
sm.executeUpdate(); O $e"3^Pa
sm.close(); ",vK~m2W_
sm = cn.createStatement("insert into corp...); z80FMulO
sm.executeUpdate(); Ee7+ob
sm.close(); vk
X+{n
3、提交 0L8fpGJ
cn.commit(); k+?gWZ\
4、如果发生异常,那么回滚 GiM-8y~
cn.rollback();