java 数据库基本操作 )oz2V9X{
1、java数据库操作基本流程 F;h^o !W7r
2、几个常用的重要技巧: d|7LCW+HW
可滚动、更新的记录集 "kBVHy
批量更新 ID!S}D
事务处理 <)T~_s
_@[W[=|H
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 6
R})KIG
1、取得数据库连接 U` HY
eJ
1)用DriverManager取数据库连接 |9IOZ>H9
例子 l&e$:=;8
String className,url,uid,pwd; 3oH/34jj
className = "oracle.jdbc.driver.OracleDriver"; 9&.md,U '
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; C4.GtY8,d
uid = "system"; K%mR=u#%&
pwd = "manager"; Y,Rr[i"j
Class.forName(className); G)t-W%D&
Connection cn = DriverManager.getConnection(url,uid,pwd); q/ 54=8*h0
2)用jndi(java的命名和目录服务)方式 nXoDI1<[
例子 5;p|iT
String jndi = "jdbc/db"; S7nx4c2xK~
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); q oi21mCn
DataSource ds = (DataSource) ctx.lookup(jndi); X9]} UX
Connection cn = ds.getConnection(); z},\1^[
多用于jsp中 Ddg!1SF
2、执行sql语句 Q~svtN
1)用Statement来执行sql语句 1E&S{.
String sql; I^ ![)# FC
Statement sm = cn.createStatement(); lN,a+S/'
sm.executeQuery(sql); // 执行数据查询语句(select) r hucBm
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Og1vD5a
2)用PreparedStatement来执行sql语句 $ B&ZnZ?
String sql; EA8plQ~GtE
sql = "insert into user (id,name) values (?,?)"; RtHai[j
PreparedStatement ps = cn.prepareStatement(sql); "0#(<zb|
ps.setInt(1,xxx); !bYVLFp=\_
ps.setString(2,xxx); Ry]9n.y
... g0U?`;n$
ResultSet rs = ps.executeQuery(); // 查询 #G F.M,O/h
int c = ps.executeUpdate(); // 更新 7Vh
aEIz,^3
3、处理执行结果 JJ_Z{
查询语句,返回记录集ResultSet ~S;-sxoO0l
更新语句,返回数字,表示该更新影响的记录数 Q>Z~={"
ResultSet的方法 gH'hA'
1、next(),将游标往后移动一行,如果成功返回true;否则返回false jI*@&3
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 wS#Uw_[
6fo"k+S
4、释放连接 w(S~}'Sg*P
cn.close(); iCg%$h
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection e"eIQI|N
:}Yk0*
可滚动、更新的记录集 Hv,ll1@h
1、创建可滚动、更新的Statement U), HrI>;
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); l/zv >
该Statement取得的ResultSet就是可滚动的 MkJBKS
2、创建PreparedStatement时指定参数 qAH^BrJ
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); $6wSqH?q
ResultSet.absolute(9000); M57<e`m
批量更新 ~Hub\kn
1、Statement Sqb>aj
Statement sm = cn.createStatement(); #!UJY%c~
sm.addBatch(sql1); q6C`hVMl
sm.addBatch(sql2); z7`|N`$Z#s
... NFEr ,n
sm.executeBatch() ov,s]g83
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 h`N2M,
2、PreparedStatement xi "3NF%=
PreparedStatement ps = cn.preparedStatement(sql); z|%Pi J,
{ X5[t6q!
ps.setXXX(1,xxx); {x,)OgK!{
... 3Q=\W<Wu
ps.addBatch(); .9B@w+=6
} 0,DrVGa
ps.executeBatch(); ^IuhHP
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 a?r$E.W'&
r2.w4RMFua
事务的处理 klFS3G
1、关闭Connection的自动提交 sV{\IgH/x
cn.setAutoCommit(false); "D_:`@V(
2、执行一系列sql语句 59l9_yFJ
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close v:/!OvLe
Statement sm ; X coPkW
sm = cn.createStatement(insert into user...); 2!B|w8ar
sm.executeUpdate(); Q}lCQK/g
sm.close(); P<vU!`x%q
sm = cn.createStatement("insert into corp...); @- |G_BZ
sm.executeUpdate(); t7x<=rW7u
sm.close();
a}FyJp
3、提交 6#CswSpS
cn.commit(); #vyf*jPr
4、如果发生异常,那么回滚 ]9/A=p?J@
cn.rollback();