java 数据库基本操作 +InFv"wt
1、java数据库操作基本流程 M}9PicI?7
2、几个常用的重要技巧: uq@_DPA7
可滚动、更新的记录集 HQrx9CXE
批量更新 f >\~h,SLL
事务处理 ~"WN4
] U[4r9V
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 oo!JAv}~
1、取得数据库连接 [L>AU;
:
1)用DriverManager取数据库连接 /3d6Og
例子 BE," lX
String className,url,uid,pwd; t8"yAYj
className = "oracle.jdbc.driver.OracleDriver"; CNyV6jb
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; fb|lWEw5h.
uid = "system"; _U%2J4T2
pwd = "manager"; nnMRp7LQ-
Class.forName(className); ((]Sy,rdk
Connection cn = DriverManager.getConnection(url,uid,pwd); &+8cI^kp
2)用jndi(java的命名和目录服务)方式 'V:ah38
例子 /??nOVvt
String jndi = "jdbc/db"; +rOd0?
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 6ieP` bct
DataSource ds = (DataSource) ctx.lookup(jndi); 'E#Bz"T
Connection cn = ds.getConnection(); x5W.
3*
多用于jsp中 !a9/8U_>XF
2、执行sql语句 >66v+
1)用Statement来执行sql语句 @Yh%.#\i%
String sql; &, WQr
Statement sm = cn.createStatement(); }%k3
sm.executeQuery(sql); // 执行数据查询语句(select) |(rTz!!-
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); -{S:sK.o
2)用PreparedStatement来执行sql语句 bF? {
String sql; O.OSLezTQ
sql = "insert into user (id,name) values (?,?)"; &e1(| qax
PreparedStatement ps = cn.prepareStatement(sql); mO^vKq4r.
ps.setInt(1,xxx); _9"%;:t
ps.setString(2,xxx);
$oH?7sj
... +:m'
ResultSet rs = ps.executeQuery(); // 查询 ?h'd\.j{
int c = ps.executeUpdate(); // 更新 FFID<Lf/2
?-9It|R
3、处理执行结果 _w49@9?
查询语句,返回记录集ResultSet b)@b63P_
更新语句,返回数字,表示该更新影响的记录数 W=
$, \D+
ResultSet的方法 r7n-Xe
1、next(),将游标往后移动一行,如果成功返回true;否则返回false u6~/"
_FwY
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ^EmI;ks
]"4\]_?r
4、释放连接 x)^t5"F
cn.close(); y4N=v{EbL
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection <>^otb,e$
lAx^!#~\
可滚动、更新的记录集 ?DKwKt
1、创建可滚动、更新的Statement ?ZT+4U00U
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ($Ck5`_MK
该Statement取得的ResultSet就是可滚动的 H6]z9 8
2、创建PreparedStatement时指定参数 wdTjJfr
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); by0M(h
ResultSet.absolute(9000); $${9 %qPzb
批量更新 =9#cf-?
1、Statement R(N5K4J
Statement sm = cn.createStatement(); t5jZ8&M5]
sm.addBatch(sql1); fkK42*U@r
sm.addBatch(sql2); 84u%_4/
... P+[\9Gg
sm.executeBatch() 8iwqy0<
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 tJ!s/|u(
2、PreparedStatement NU$?BiB?R
PreparedStatement ps = cn.preparedStatement(sql); 8^6dK
{ 8!u8ZvbFG
ps.setXXX(1,xxx); }o MY
... l<=Y.P_2
ps.addBatch(); pcjb;&<
} 5t~p99#?
ps.executeBatch(); 'J"m`a8no
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 E]j2%}6Z%
\dw*yZ^
事务的处理 zeG_H}[2&
1、关闭Connection的自动提交 D "9Hv3
cn.setAutoCommit(false); b(|1DE0Cv
2、执行一系列sql语句 mu}T,+9\
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close t^-yK;`?q:
Statement sm ; JVeb$_0k
sm = cn.createStatement(insert into user...); Ju.B!)uS#
sm.executeUpdate(); WaYT7 :
sm.close(); COk;z.Kn
sm = cn.createStatement("insert into corp...); 1Ydym2
sm.executeUpdate(); maR5hgWCHe
sm.close(); [<p7'n3x
3、提交 DKxzk~sOM
cn.commit(); O+Q t8,
4、如果发生异常,那么回滚 ts3BmfR?
cn.rollback();