java 数据库基本操作 nL`9l1
1、java数据库操作基本流程 m9$:9yRm
2、几个常用的重要技巧: D9ufoa&ua
可滚动、更新的记录集 cSD{$B:
批量更新 93%{scrm
事务处理 LgqGVh3\s
3!9Z=-tD
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ^JeMuU
1、取得数据库连接 h BMH)aU
1)用DriverManager取数据库连接 F3E[wdT
例子 AHh#Fx+K
String className,url,uid,pwd; a' FN 3
className = "oracle.jdbc.driver.OracleDriver"; }<m{~32M
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ~hX-u8Ul'N
uid = "system"; ;2`sN
pwd = "manager"; }7/e8 O2
Class.forName(className); E)p9eU[#
Connection cn = DriverManager.getConnection(url,uid,pwd); sa-9$},z4
2)用jndi(java的命名和目录服务)方式 6F0(aGs
例子 v"6 \=@
String jndi = "jdbc/db"; $xW**&
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); V^fV7hw<
DataSource ds = (DataSource) ctx.lookup(jndi); :-+4:S
Connection cn = ds.getConnection(); NlPS#
多用于jsp中 2Oc$+St~8
2、执行sql语句 ? 5|/
C
1)用Statement来执行sql语句 2ypIq
String sql; ISqfU]>[
Statement sm = cn.createStatement(); $ @1u+w
sm.executeQuery(sql); // 执行数据查询语句(select) ZW4aY}~)$
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); mf$j03tu
2)用PreparedStatement来执行sql语句 UsW5d]i}Y
String sql; t 0O4GcAN
sql = "insert into user (id,name) values (?,?)"; f?UzD#50D
PreparedStatement ps = cn.prepareStatement(sql); L10IF
ps.setInt(1,xxx); %_)zWlN
ps.setString(2,xxx); [s6C
ZcL
... 7!4V>O8@
ResultSet rs = ps.executeQuery(); // 查询 {[OwMk
int c = ps.executeUpdate(); // 更新 1=GI&f2I
)c<6Sfp^B
3、处理执行结果 aq>?vti1D
查询语句,返回记录集ResultSet 4MvC]_&
更新语句,返回数字,表示该更新影响的记录数 Ej(2w Q
ResultSet的方法 h[Tk;h
1、next(),将游标往后移动一行,如果成功返回true;否则返回false @'jfKW
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 "~+.Af
:hqZPajE
4、释放连接 V0i9DK|!
cn.close(); hl/itSl$
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection a|qsQ'1,;
MK$Jj"
可滚动、更新的记录集 .KA V) So"
1、创建可滚动、更新的Statement |ng%PQq)
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); POd/+e9d
该Statement取得的ResultSet就是可滚动的 bg7n
2、创建PreparedStatement时指定参数 BW K IbG
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Wr%7~y*K
ResultSet.absolute(9000); I48VNX
批量更新 :F(9"L
1、Statement LJuW${Y
Statement sm = cn.createStatement(); I0w%8bs
sm.addBatch(sql1); Gp2!xKgm
sm.addBatch(sql2); lgD]{\O$ip
... &d^=siL
sm.executeBatch() %$X\"
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 zQfkMa.
2、PreparedStatement qd2xb8r
PreparedStatement ps = cn.preparedStatement(sql); v|@1(
{ A" !n1P
ps.setXXX(1,xxx); x mo&![P
... #+jUhxq
ps.addBatch(); kK[duW=6
} x-Z^Q C
ps.executeBatch(); c ~Kc7}I
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 7 `Du5>b8
B@cz
?%]
事务的处理 2i:zz?
'p`
1、关闭Connection的自动提交 L,M+sN
cn.setAutoCommit(false); 3E|;r
_;
8
2、执行一系列sql语句 Wc4vCVw
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close wq\G|/%
Statement sm ; 'D6
bmz
sm = cn.createStatement(insert into user...); U ":"geU
sm.executeUpdate(); ~[18q+,
sm.close(); IC~ljy]y_
sm = cn.createStatement("insert into corp...); 4XG]z_+I
sm.executeUpdate(); VXC4%
sm.close(); %$n02"@
3、提交 X>3^a'2,E
cn.commit(); iJnh$jo
4、如果发生异常,那么回滚 h|W%4|]R)
cn.rollback();