java 数据库基本操作 O Ke
9/._
1、java数据库操作基本流程 {t|Q9&
2、几个常用的重要技巧: =!u]t&yv
可滚动、更新的记录集 gts09{"}Y
批量更新 hISYtNWjd"
事务处理 )j!%`g
Cz6bD$5
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 .>1vN+
1、取得数据库连接 s9SUj^
1)用DriverManager取数据库连接 E:Ul_m8
例子 mc4|@p*
String className,url,uid,pwd; vI]V@il
className = "oracle.jdbc.driver.OracleDriver"; =R*IOJ
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; p-*{x
uid = "system"; =^z*p9ZB
pwd = "manager"; *onVG5<
Class.forName(className); ;
W$.>*O
Connection cn = DriverManager.getConnection(url,uid,pwd); .E;}.X
2)用jndi(java的命名和目录服务)方式 Ld
0j!II(
例子 `4wy
*!]
String jndi = "jdbc/db"; qv[w
1;U"
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); GJ:oUi
DataSource ds = (DataSource) ctx.lookup(jndi); 2V*;=cv~z
Connection cn = ds.getConnection(); J;ycAF ~
多用于jsp中 z{/#/,V5D4
2、执行sql语句 8X/SNRk6p
1)用Statement来执行sql语句 vAjog])9s
String sql; h+w1 D} *
Statement sm = cn.createStatement(); mR~S$6cc
sm.executeQuery(sql); // 执行数据查询语句(select) JFq<sY!
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); >7z(?nQYT^
2)用PreparedStatement来执行sql语句 n[\L6}
String sql; 9'p*7o
sql = "insert into user (id,name) values (?,?)"; S<z 8
PreparedStatement ps = cn.prepareStatement(sql); N{<5)L~Y
ps.setInt(1,xxx); )5fly%-r)
ps.setString(2,xxx); 3xgU=@!;
... =&PO_t5)z
ResultSet rs = ps.executeQuery(); // 查询 4#W*f3d[@:
int c = ps.executeUpdate(); // 更新 L s+zJ1
yq!peFu
3、处理执行结果 *VaQ\]:d
查询语句,返回记录集ResultSet +_jM$?:F}
更新语句,返回数字,表示该更新影响的记录数 3Xy~ap>Y
ResultSet的方法 bI8')a
1、next(),将游标往后移动一行,如果成功返回true;否则返回false #mD_<@@
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ?rziKT5OOC
&{q<
4、释放连接 t"OP*
cn.close(); $ago
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 7Rd(,eWE@
qDgy7kkQ
可滚动、更新的记录集 goND S5}
1、创建可滚动、更新的Statement bK{ VjXF
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); js!C`]1
该Statement取得的ResultSet就是可滚动的 Kd\d>&b
2、创建PreparedStatement时指定参数 9*XT|B
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ilZQ/hOBH
ResultSet.absolute(9000); {asq[;]
批量更新 `l %,4qR
1、Statement R
G~GVf
Statement sm = cn.createStatement(); di7cCn
sm.addBatch(sql1); 5Q: %f
sm.addBatch(sql2); &da:{
... 'j!n
sm.executeBatch() s[VYd:}se
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 M"-.D;sa1
2、PreparedStatement *;Cpz[N
PreparedStatement ps = cn.preparedStatement(sql); 3J8M0W
{ &8I*N6p:%/
ps.setXXX(1,xxx); _C19eW'
... T7o7t5*
ps.addBatch(); d^`;tD
} C=2DxdZG
ps.executeBatch(); bf.yA:~U
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 7 0EH~
hZWkw{c
事务的处理 eU.C<Tv:8
1、关闭Connection的自动提交 2B5Ez,'#x
cn.setAutoCommit(false); o_5[}d
2、执行一系列sql语句 c2L\m*^o
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close !#W3Q
Statement sm ; dp4vybJ
sm = cn.createStatement(insert into user...); /%)(Uz
sm.executeUpdate(); ?}= $zN
sm.close(); ~_IQ:]k
sm = cn.createStatement("insert into corp...); 1=e(g#Ajn\
sm.executeUpdate(); lXEnm-_
sm.close(); ;|W:,a{kS
3、提交 qn'TIE.
cn.commit(); =(~Zm B\
4、如果发生异常,那么回滚 /82E[P"}6R
cn.rollback();