java 数据库基本操作 &[a Tw{2
1、java数据库操作基本流程 B/J&l
2、几个常用的重要技巧: {%.Lk'#9
可滚动、更新的记录集 4KI [D{
批量更新
sM\lO
事务处理 dQgk.k
aV`&L,Q)7E
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 TFR(
4W
1、取得数据库连接 F?u^"}%Fc
1)用DriverManager取数据库连接 y^Vw`-e
例子 1ndJ+H0H
String className,url,uid,pwd; w%c
className = "oracle.jdbc.driver.OracleDriver"; maSgRf[g
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; J^m<*
uid = "system"; sT1&e5`W
pwd = "manager"; ;pJ2V2 g8
Class.forName(className); aF8k/$u
Connection cn = DriverManager.getConnection(url,uid,pwd); /}5B&TZ=(3
2)用jndi(java的命名和目录服务)方式 T7$S_
例子 V5D2\n3A
String jndi = "jdbc/db"; wP"q<W
g
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); K{cbn1\,H
DataSource ds = (DataSource) ctx.lookup(jndi); cPn+<M#
Connection cn = ds.getConnection(); !&]z*t
多用于jsp中 oc{EuW{Ag
2、执行sql语句 [U\(G
1)用Statement来执行sql语句 p"`%
String sql; d"~(T:=r
Statement sm = cn.createStatement(); rrs"N3!aT
sm.executeQuery(sql); // 执行数据查询语句(select) 99OD=pxQ
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 7Bz*r0 9S
2)用PreparedStatement来执行sql语句 ~VTs:h
String sql; Y7U&Q:5'
sql = "insert into user (id,name) values (?,?)";
1;| LI?
PreparedStatement ps = cn.prepareStatement(sql); 2GWDEgI1o
ps.setInt(1,xxx);
BRbV7&
ps.setString(2,xxx); ohc1 ~?3b
... Bmo$5$
ResultSet rs = ps.executeQuery(); // 查询 VjbG(nB?_
int c = ps.executeUpdate(); // 更新 W W "i
0=6/yc
3、处理执行结果 nhdTTap&9
查询语句,返回记录集ResultSet 0O2n/`'
更新语句,返回数字,表示该更新影响的记录数 sI 4yG
ResultSet的方法 U!e6FHj7
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Az,-
Cq
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 MZ#T^Y
\
Aq;Q?
4、释放连接 zPZF|%|
cn.close(); TSo:7&|
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection (E($3t8
:WXf.+IA
可滚动、更新的记录集 :#="%
1、创建可滚动、更新的Statement )u@c3?$6
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); MonS hIz
该Statement取得的ResultSet就是可滚动的
FfM nul
2、创建PreparedStatement时指定参数 V!|e#}1/
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); SFjU0*B$
ResultSet.absolute(9000); =^h~!ovj:
批量更新 <%bw/
1、Statement _zC (J
Statement sm = cn.createStatement(); (TSqc5^H
sm.addBatch(sql1); ~!+h?[miV
sm.addBatch(sql2); V`fL%du,3
... 5)+F(
sm.executeBatch() 0H=9@
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 'I/h(
2、PreparedStatement hSqMaX%G
PreparedStatement ps = cn.preparedStatement(sql); 2HOe__Ns
{ M?o{STt
ps.setXXX(1,xxx); FMu!z
... ;Gm>O7"|@
ps.addBatch(); r(uP!n1+
} (;6s)z
ps.executeBatch(); H`<?<ak6'M
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 73DlRt
*
E`p'L!z
事务的处理 bY#;E;'7
1、关闭Connection的自动提交 _|n=cC4Qu
cn.setAutoCommit(false); U6WG?$x
2、执行一系列sql语句 rS~qi}4X
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close rm+v(&
Statement sm ; PM~*|(fA
sm = cn.createStatement(insert into user...); 4nX(:K}>
sm.executeUpdate(); %"7WXOv&z
sm.close(); n@B{vyy
sm = cn.createStatement("insert into corp...); qw:9zYG}qW
sm.executeUpdate(); T_L6 t66I
sm.close(); !p%@Deu
3、提交 F+j O*F2h
cn.commit(); fuSq ={]
4、如果发生异常,那么回滚 /GsrGX8
cn.rollback();