java 数据库基本操作 !j6]k^ra
1、java数据库操作基本流程 `itaQGLD
2、几个常用的重要技巧: ! q!
=VC
可滚动、更新的记录集 RZ9vQ\X
U)
批量更新 7E4=\vM
事务处理 eZ
y)>.6Z
T@uY6))>F
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 <SUjz}_Oa:
1、取得数据库连接 LZV
1)用DriverManager取数据库连接 xjiMM>|n
例子 !dYkvoQNn
String className,url,uid,pwd; W~
XJ ']e
className = "oracle.jdbc.driver.OracleDriver"; R}a,.C
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Sve~-aG
uid = "system"; ;=Jj{FoG%
pwd = "manager"; Slcf=
Class.forName(className); r@0HqZx`
Connection cn = DriverManager.getConnection(url,uid,pwd); agN`)
F!
2)用jndi(java的命名和目录服务)方式 >sdj6^[+
例子 `9Zoq=/
String jndi = "jdbc/db"; .0S.7w3dZo
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); b40zYH`'{
DataSource ds = (DataSource) ctx.lookup(jndi); 5 @bLDP
Connection cn = ds.getConnection(); I|,^a|\
多用于jsp中 2GA6@-u\
2、执行sql语句 V=BF"S;-'
1)用Statement来执行sql语句 MOY.$M,1
String sql; sXkWs2!
Statement sm = cn.createStatement(); %p)6m2Sb
sm.executeQuery(sql); // 执行数据查询语句(select) 7\'vSHIL
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); @;M( oFS9
2)用PreparedStatement来执行sql语句 3Ln~"HwP
String sql; V=
U=
sql = "insert into user (id,name) values (?,?)"; i2/:'
i
PreparedStatement ps = cn.prepareStatement(sql); Zh]d&Xeq
ps.setInt(1,xxx); Glcl7f"<^
ps.setString(2,xxx); &xMR{:
... [S9T@Q
ResultSet rs = ps.executeQuery(); // 查询 R3<>]/1p|P
int c = ps.executeUpdate(); // 更新 c 's=>-X
7-.YVM~R
3、处理执行结果 /Ou`$2H87
查询语句,返回记录集ResultSet *r$Yv&c,
更新语句,返回数字,表示该更新影响的记录数 ]fIv{[A_
ResultSet的方法 MbC7`Sp&i
1、next(),将游标往后移动一行,如果成功返回true;否则返回false #.UooFk+Y
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 (EGsw o
o-Pa3L=
4、释放连接 ge9j:S{
cn.close(); K?,eIZ{.S
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection kXA
o+l
aErms-~
可滚动、更新的记录集 4<)%Esyb
1、创建可滚动、更新的Statement b"t95qlL
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); iXK.QktHw
该Statement取得的ResultSet就是可滚动的 ilEWxr;,
2、创建PreparedStatement时指定参数 3:7J@>
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); -z./6dQ
ResultSet.absolute(9000); o {Sc
批量更新 \:]Clvc
1、Statement fGHYs
Statement sm = cn.createStatement(); oE[wOq+
sm.addBatch(sql1); p<*3mbgGO
sm.addBatch(sql2); -gefdx6ES
... k`U")lv
sm.executeBatch() xGCW-YR9
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 !*ct3{m
2、PreparedStatement XYhN;U}Z
PreparedStatement ps = cn.preparedStatement(sql); )4>M<BO
{ W'u6F-$2
ps.setXXX(1,xxx); P%
_cIR
... :jB~rhZ~
ps.addBatch(); Ikql
} :oYu+cQ
ps.executeBatch();
i-w^pv'
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 q%%8oaEI
NypM+y
事务的处理 @&t';"AE
1、关闭Connection的自动提交 #g*U\y
cn.setAutoCommit(false); ]/hF!eO
2、执行一系列sql语句 3
HOJCgit
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Gf(hN|X.
Statement sm ; Q;W[$yvW
sm = cn.createStatement(insert into user...); O|=5+X
sm.executeUpdate(); oa$-o/DhB
sm.close(); {m~.'DU
sm = cn.createStatement("insert into corp...); \7rFfN3
sm.executeUpdate(); (+q#kKR
sm.close(); >=BH$4Ce
3、提交 ggtGecKm
cn.commit(); b<>GF-`w
4、如果发生异常,那么回滚 : kz*.1
cn.rollback();