java 数据库基本操作 e['<.Yf+
1、java数据库操作基本流程 )]s<Czm%
2、几个常用的重要技巧: ,~DV0#"
可滚动、更新的记录集 niKfat?
批量更新 }pIn3B)
事务处理 cnI5G!
5n{d jP
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ,[)l>!0\H
1、取得数据库连接 r$8'1s37`
1)用DriverManager取数据库连接 hzRKv6
例子 dDIR~!T
String className,url,uid,pwd; W"GW[~
h
className = "oracle.jdbc.driver.OracleDriver"; b?c/J{me
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; =^i K^)
uid = "system"; kwL|gO1L
pwd = "manager"; ts9wSx~[+
Class.forName(className); .Z
67
Connection cn = DriverManager.getConnection(url,uid,pwd); cR_ pC
9z
2)用jndi(java的命名和目录服务)方式 _DH^ K9,9
例子 sRA2O/yKCE
String jndi = "jdbc/db"; "RN]
@p#m
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); DA.k8M
DataSource ds = (DataSource) ctx.lookup(jndi); P_w4
DU
Connection cn = ds.getConnection(); .7
0
多用于jsp中 b^Re947{g
2、执行sql语句 /s}
"0/Y\
1)用Statement来执行sql语句 <|jh3Hlp
String sql; w.a9}GC
Statement sm = cn.createStatement(); /Pkz3(1
sm.executeQuery(sql); // 执行数据查询语句(select) 6#!CBY^{
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 5l
3PAG
2)用PreparedStatement来执行sql语句 6{Q-]LOc[.
String sql; V`1{*PrI@L
sql = "insert into user (id,name) values (?,?)"; PXkpttIE]M
PreparedStatement ps = cn.prepareStatement(sql); 66,(yxg
ps.setInt(1,xxx); #$x,PeG
ps.setString(2,xxx); .8u@/f%pV
... kuD$]A
Q`&
ResultSet rs = ps.executeQuery(); // 查询 CV.|~K0O
int c = ps.executeUpdate(); // 更新 ws+ '*7
vxj:Y'}
3、处理执行结果 C| ~A]wc=
查询语句,返回记录集ResultSet <D ~hhGb
更新语句,返回数字,表示该更新影响的记录数 Q(nTL WW
ResultSet的方法 3Iv^
1、next(),将游标往后移动一行,如果成功返回true;否则返回false jDpA>{O[
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Cl<!S`
+w^,!gA&
4、释放连接 Z%]K,9K
cn.close();
,"(G
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection mn?F;=qE
:LY.C<8
可滚动、更新的记录集 qBX_v5pvVA
1、创建可滚动、更新的Statement !SW0iq[7j
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); RI&O@?+U
该Statement取得的ResultSet就是可滚动的 MmN{f~Kq9
2、创建PreparedStatement时指定参数 b;UBvwY_
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); tr[}F7n9
ResultSet.absolute(9000); W_`]7RO8
批量更新 <-`.u`
1、Statement ,bl }@0A
Statement sm = cn.createStatement(); $qQYxx@
sm.addBatch(sql1); kg]6q T;Y
sm.addBatch(sql2); 1"ZtE\{
"
... .cHgYHa
sm.executeBatch() GHcx@||C?
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 i *.Y
2、PreparedStatement $:F+Nf
8
PreparedStatement ps = cn.preparedStatement(sql); FfJ;r'eGs
{ dgkS5Q$/
ps.setXXX(1,xxx); )OV0YfO
... ~~OFymQ%?q
ps.addBatch(); &<BBPn@\
} OB(oOPH
ps.executeBatch(); = UH3.
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 8@m$(I+
4=([v;fc
事务的处理 6e+'Y"v
1、关闭Connection的自动提交 .d1ff];
cn.setAutoCommit(false); d2`g,~d
2、执行一系列sql语句 W\~^*ny
P6
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close {=ox1+d
Statement sm ; $9,&BW_*
sm = cn.createStatement(insert into user...); ,/{e%J
sm.executeUpdate(); 10FiA;
sm.close(); ZZT #V%Q=u
sm = cn.createStatement("insert into corp...); }L_YpG7
sm.executeUpdate(); +lx&$mr?
sm.close(); bqcCA91
3、提交 eO!9;dJ
cn.commit(); 5daq}hsQs
4、如果发生异常,那么回滚 1hG#
cn.rollback();