java 数据库基本操作 &S{RGXj_
1、java数据库操作基本流程 "bFTk/
2、几个常用的重要技巧: @Owb?(6?
可滚动、更新的记录集 cs,N <|
批量更新 +%zAQeb
事务处理 V)Z}En["1
>Wm`v.-
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 q8X feoUV
1、取得数据库连接 Y;dz,}re
1)用DriverManager取数据库连接 2iY3Lsna
例子 f2Klt6"9
String className,url,uid,pwd; mXRB7k
className = "oracle.jdbc.driver.OracleDriver"; }iXDa?6%
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ZXqSH${Tp
uid = "system"; B8.Pn
pwd = "manager"; <r.)hT"0
Class.forName(className); bR*-Ht+wd
Connection cn = DriverManager.getConnection(url,uid,pwd); KyVQh8
2)用jndi(java的命名和目录服务)方式 Y}t \4 di
例子 1tEgl\u\
String jndi = "jdbc/db"; wKtl+}}
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 2#KJ asX
DataSource ds = (DataSource) ctx.lookup(jndi); mq aHwID
Connection cn = ds.getConnection(); dsb `xw
多用于jsp中 ^=BTz9QM
2、执行sql语句 q-[@$9AS
1)用Statement来执行sql语句 .Xfq^'I[
String sql; ^W`<gR
Statement sm = cn.createStatement(); 5A)2} D]
sm.executeQuery(sql); // 执行数据查询语句(select) |4)>:d
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); HmiR.e%<b
2)用PreparedStatement来执行sql语句 WZ-s--n#
String sql; 0t^M3+nc
sql = "insert into user (id,name) values (?,?)"; ?J%1#1L"/
PreparedStatement ps = cn.prepareStatement(sql); 7]U"Z*
ps.setInt(1,xxx); h;C5hU4P
ps.setString(2,xxx); 35Ij
..z0
... 54gBJEhg
ResultSet rs = ps.executeQuery(); // 查询 1Ce@*XBU
int c = ps.executeUpdate(); // 更新 yQ_B)b
r54&XE]O
3、处理执行结果 )JDs\fUE
查询语句,返回记录集ResultSet 9A/\h3HrJ
更新语句,返回数字,表示该更新影响的记录数 Hbj,[$Jb
ResultSet的方法 ^!<U_;+
1、next(),将游标往后移动一行,如果成功返回true;否则返回false l7XUXbYp&=
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 !^^?dRd*v
;;_,~pI?k
4、释放连接 eV2W{vuI
cn.close(); TTeH`
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 8;d:-Cp
{'XggI%
可滚动、更新的记录集 R?GDJ3
1、创建可滚动、更新的Statement gQ o]
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ;\a
YlV-
该Statement取得的ResultSet就是可滚动的 %7"q"A r[
2、创建PreparedStatement时指定参数 TC@s
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); nG,A@/N
ResultSet.absolute(9000); "W=AB&
批量更新 S'|,oUWDb
1、Statement R}G4rO-J
Statement sm = cn.createStatement(); 3*]eigi)
sm.addBatch(sql1); T_s_p
sm.addBatch(sql2); LIS)(X<]?
... [="e
ziM{
sm.executeBatch() ?^H
`M|S
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Vu)4dD!
2、PreparedStatement OglEt[ "
PreparedStatement ps = cn.preparedStatement(sql); )T/0S$@
{ Ov};e
ps.setXXX(1,xxx); !Z`j2
e}
... w&$`cD
ps.addBatch(); vX{J' H]u
} )jU)_To
ps.executeBatch(); *?Lv3}E
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ~?D4[D|sB
9)y/:sO<P
事务的处理 _76PIR{an
1、关闭Connection的自动提交 yL%K4$z
cn.setAutoCommit(false); y-T| #
2、执行一系列sql语句 NhfJ30~
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close rx $mk
Statement sm ; r#+d&.|
sm = cn.createStatement(insert into user...); zAK+8{,
sm.executeUpdate(); {!.(7wV\
sm.close(); 4zASMu
sm = cn.createStatement("insert into corp...); 2>|dF~"
sm.executeUpdate(); L;
T8?+ x
sm.close(); D!Q">6_"z
3、提交 ;o^eC!:/%
cn.commit(); }E+!91't.^
4、如果发生异常,那么回滚 ,oN8HpGs
cn.rollback();