java 数据库基本操作 ^;bGP.!p
1、java数据库操作基本流程 I).^,%>Z)
2、几个常用的重要技巧: "u,~yxYWl
可滚动、更新的记录集 6&OonYsP
批量更新 mISuo
事务处理 2\z`G
RqX4ep5j
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 )qe$rD;N
1、取得数据库连接 soQv?4
1)用DriverManager取数据库连接 S{"6PXzb
例子 3$kv%uf{
String className,url,uid,pwd; :hl}Zn~jt
className = "oracle.jdbc.driver.OracleDriver"; kGBl)0pr`x
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; -fSKJo#}|
uid = "system"; 0| DG\&?
pwd = "manager"; 2)I'5?I
Class.forName(className); %.6?\w1e
Connection cn = DriverManager.getConnection(url,uid,pwd); {7pE9R 5
2)用jndi(java的命名和目录服务)方式 c J"]yG)=
例子 t-<[._:+
String jndi = "jdbc/db"; ;ijfI
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ["#A -S
DataSource ds = (DataSource) ctx.lookup(jndi); q2j}64o_S
Connection cn = ds.getConnection(); @=zBF'<.9
多用于jsp中 ^kR^
QL$
2、执行sql语句 E*T84Jh6
1)用Statement来执行sql语句 c&I,eds
String sql; #35S7G^ @`
Statement sm = cn.createStatement(); K7&8;So
sm.executeQuery(sql); // 执行数据查询语句(select) x_H7=\pX]
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); n`I
jG
2)用PreparedStatement来执行sql语句 TeN1\rA,
String sql; yg[Oy#^
sql = "insert into user (id,name) values (?,?)"; C5lD
Hw[CX
PreparedStatement ps = cn.prepareStatement(sql); M3Z Jt' |
ps.setInt(1,xxx); 23n8,} H,
ps.setString(2,xxx); }HQT@&=
... G'}_ZUy#
ResultSet rs = ps.executeQuery(); // 查询 A'AWuj\r2R
int c = ps.executeUpdate(); // 更新 zH\;pmWiN9
pt|$bU7
3、处理执行结果 r0$9c
查询语句,返回记录集ResultSet !\k#{
1[!
更新语句,返回数字,表示该更新影响的记录数 W-ND<=:Up
ResultSet的方法 0Eg r
Q
1、next(),将游标往后移动一行,如果成功返回true;否则返回false :~A1Ud4c
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 [@FeRIu8
wM&x8 <
4、释放连接 d<cbp[3F
cn.close(); [;LPeO
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection [Oy2&C
h}:5hi Jw
可滚动、更新的记录集 !VZCM{
1、创建可滚动、更新的Statement o >4>7
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); N, +g/o\f
该Statement取得的ResultSet就是可滚动的 #&8pp8wd,}
2、创建PreparedStatement时指定参数 |(w#NE5
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); fF]&{b~wk
ResultSet.absolute(9000); m=l3O:~J
批量更新
! +VN
1、Statement N*oJ$:#
Statement sm = cn.createStatement(); (Gk]<`d#N
sm.addBatch(sql1); AkQFb2|ir
sm.addBatch(sql2); .Fz6+m;Z
... U[ O!&:6
sm.executeBatch() APm[)vw#f
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 zq>"a&Y,
2、PreparedStatement v"TH[}C9D
PreparedStatement ps = cn.preparedStatement(sql); qiJ;v1
{ 3nGK674;z
ps.setXXX(1,xxx); bv" ({:x
... Ekp
0.c8:
ps.addBatch(); 6j![m+vo%
} #yxYL0CcA:
ps.executeBatch(); ptfADG
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Q*o4zW
SvrV5X
事务的处理 Rzj!~`&N
1、关闭Connection的自动提交 Ykq }9
cn.setAutoCommit(false); "2j~3aWj
2、执行一系列sql语句 }eK*)
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close !.N=Y;@lY
Statement sm ; Efd[ZJxS6
sm = cn.createStatement(insert into user...); Cagq0-:(p
sm.executeUpdate(); du)G)~
sm.close(); }/FM#Xh
sm = cn.createStatement("insert into corp...); +& Qqu`)?F
sm.executeUpdate(); GUZi }a|=
sm.close(); I9 aber1
3、提交 l,8|E
cn.commit(); M,lu)~H
4、如果发生异常,那么回滚 MkG->*
cn.rollback();