java 数据库基本操作 A[WV'!A,
1、java数据库操作基本流程 Vx_rc%'
2、几个常用的重要技巧: PM":Vd/
可滚动、更新的记录集 )6~1 ^tD
批量更新 d3^OEwe
事务处理 rw)kAe31
0ult7s}
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 /J)l /oI
1、取得数据库连接 Jw~( G9G
1)用DriverManager取数据库连接 ``ekR6[ 8c
例子 *Ywpz^2?:
String className,url,uid,pwd; R_sC! -
className = "oracle.jdbc.driver.OracleDriver"; 2wqk,c[]
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; -yDs<
Xl
uid = "system"; .k4W_9
pwd = "manager"; `bKA+c,f
Class.forName(className); D\/xu-&
Connection cn = DriverManager.getConnection(url,uid,pwd); NrDi
2)用jndi(java的命名和目录服务)方式 @5)
8L/[l
例子 xyr+_k-x&q
String jndi = "jdbc/db"; (wmBjQ]B<
Context ctx = (Context) new InitialContext().lookup("java:comp/env");
wiX ~D
DataSource ds = (DataSource) ctx.lookup(jndi); 9{j66
Connection cn = ds.getConnection(); c.\O/N
多用于jsp中 9t@:4O
2、执行sql语句 ~](fFa{
1)用Statement来执行sql语句 YGc^h(d
String sql; ^% Q|s#w.
Statement sm = cn.createStatement(); B~'MBBD"
sm.executeQuery(sql); // 执行数据查询语句(select) 0:KE@=
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); e$c?}3E!z
2)用PreparedStatement来执行sql语句 (SVWdgb
String sql; -oz`"&%
sql = "insert into user (id,name) values (?,?)"; ^BZkHAp
PreparedStatement ps = cn.prepareStatement(sql); bU 63X={
ps.setInt(1,xxx); 0^'B3$>
ps.setString(2,xxx); 0i[zup
... \bCX=E-
ResultSet rs = ps.executeQuery(); // 查询 8
6QE/M
int c = ps.executeUpdate(); // 更新 @+U,Nzd
H(0q6~|
3、处理执行结果 UkCnqNvx
查询语句,返回记录集ResultSet /\mKY%kyh
更新语句,返回数字,表示该更新影响的记录数 zT~B6
ResultSet的方法 (wRBd
1、next(),将游标往后移动一行,如果成功返回true;否则返回false t<:D@J]a
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 /W#O +
b4Y8N"hL%
4、释放连接 RnfXN)+P
cn.close(); +kdySWF
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection mxSKG>
O
!0/z>#b
可滚动、更新的记录集 !~<siy
1、创建可滚动、更新的Statement
IGX:H)&*
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ,(G%e
该Statement取得的ResultSet就是可滚动的 gJ2
H=#M
2、创建PreparedStatement时指定参数
(kTXP_
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 64Gi8|P
ResultSet.absolute(9000); vAP{;Q0i
批量更新 <I;*[;AK
1、Statement (\puf+
Statement sm = cn.createStatement(); [-*F"}D,
sm.addBatch(sql1); ~#:e *:ro
sm.addBatch(sql2); lhC6S'vq
... jn9 ShF
sm.executeBatch() ~c{:DM
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 u}9fj
2、PreparedStatement bAxTLIf
PreparedStatement ps = cn.preparedStatement(sql); +?RGta'%k
{ @E`?<|B}
ps.setXXX(1,xxx); -jg (G GJ
... /7$mxtB5%L
ps.addBatch(); j&6 jRX
} &;H{cv`
ps.executeBatch(); Iy
{U'a!
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ZeasYSo4P
$7I]`Jt
事务的处理 _8K%`6!"Z
1、关闭Connection的自动提交 9Z\z96O-
cn.setAutoCommit(false); V'Y{v
2、执行一系列sql语句 xFp<7p
L
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close +-068k(
Statement sm ; ;~HNpu$
sm = cn.createStatement(insert into user...); 1H:ea7YVU
sm.executeUpdate(); oL/o*^
sm.close(); (U.**9b;
sm = cn.createStatement("insert into corp...); Tc
ZnmN
sm.executeUpdate(); w'Z!;4E0
sm.close(); 7x.%hRk
3、提交 pt:;9hA
cn.commit(); !^U6Z@&/R
4、如果发生异常,那么回滚 {j(4m
cn.rollback();