java 数据库基本操作 2ou?:5i
1、java数据库操作基本流程 /~Iy1L#
2、几个常用的重要技巧: S3m+(N" &
可滚动、更新的记录集 rX[R`,`>Z[
批量更新 O%I'
事务处理 KpL82
xXtDGP
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 w pvaTHo
1、取得数据库连接 -e ya$C
1)用DriverManager取数据库连接 8V nZ@*
例子 {+MMqJCa
String className,url,uid,pwd; h)rHf3:
className = "oracle.jdbc.driver.OracleDriver"; /T@lHxX
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; M;OYh
uid = "system"; In
r%4&!e
pwd = "manager"; &'R]oeag
Class.forName(className); +^.(3Aw
Connection cn = DriverManager.getConnection(url,uid,pwd); q0}LfXql8
2)用jndi(java的命名和目录服务)方式 LYKepk
例子 6S(3tvUr
String jndi = "jdbc/db"; UcZ3v]$I
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 'D
bHXS7N
DataSource ds = (DataSource) ctx.lookup(jndi); LQe<mZ<
Connection cn = ds.getConnection(); ]=/f`
多用于jsp中 _Z%C{~,7)x
2、执行sql语句 8LL);"$
1)用Statement来执行sql语句 >9DgsA`'
String sql; AjpQb~\
Statement sm = cn.createStatement(); *KMCU
m
sm.executeQuery(sql); // 执行数据查询语句(select) P*}Oi7Z
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 1/z1~:Il
2)用PreparedStatement来执行sql语句 +MEWAW[}^
String sql; SE\`JGA[
sql = "insert into user (id,name) values (?,?)"; D_{J:Hb
PreparedStatement ps = cn.prepareStatement(sql); `CV a`%
ps.setInt(1,xxx); C1_NGOvT
ps.setString(2,xxx); QwiC2}/
... C$_H)I
ResultSet rs = ps.executeQuery(); // 查询 h1"#DnK7
int c = ps.executeUpdate(); // 更新 sXFD]cF
gaJS6*P#
3、处理执行结果 h)w<{/p(
查询语句,返回记录集ResultSet _Nd\Cm
更新语句,返回数字,表示该更新影响的记录数 79Iz,_
ResultSet的方法 Z?~7#F~Z`
1、next(),将游标往后移动一行,如果成功返回true;否则返回false C][`Dk\D{
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 vi'K|[!?
r6A7}v
4、释放连接 A;kB"Tx
cn.close(); I|:*Dy,~
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ? in&/ZrB
PiN3t]2
可滚动、更新的记录集 #2}S83
k
1、创建可滚动、更新的Statement ,}NG@JID
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); k;%}%"EVZ
该Statement取得的ResultSet就是可滚动的 sbRg=k&Ns
2、创建PreparedStatement时指定参数 =zsXa=<
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Ws=J)2q
ResultSet.absolute(9000); 6D$xG"c
批量更新 P~~RK&+i
1、Statement |(w x6H:
Statement sm = cn.createStatement(); "k+QDQ3=
sm.addBatch(sql1); P)T:6K
sm.addBatch(sql2); LNj|t)O v
... bBZvL
sm.executeBatch() JL<}9K
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 {#7t(:x
2、PreparedStatement h7g9:10
PreparedStatement ps = cn.preparedStatement(sql); .AKx8=f
{ c;j]/R$i
ps.setXXX(1,xxx); [ML4<Eb+x
... ?)9 6YX'
ps.addBatch(); *d@}'De{8
} 5ewQjwW0
ps.executeBatch(); Ouj5NL
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 %o5GD
Dgdh3q;
事务的处理 "zr%Q'Ky
1、关闭Connection的自动提交 R (6Jvub"I
cn.setAutoCommit(false); VRD2e
,K
2、执行一系列sql语句 Blu^\:?#z-
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Rq;R{a
Statement sm ; p.zU9rID
sm = cn.createStatement(insert into user...); &fW;;>
sm.executeUpdate(); -QRKDp
sm.close(); #ujcT%1G
sm = cn.createStatement("insert into corp...); R(csJ4F
sm.executeUpdate(); ?9AByg
sm.close(); #x'C
3、提交 *rA!`e*
cn.commit(); sO6+L
#!
4、如果发生异常,那么回滚 pnf3YuB
cn.rollback();