java 数据库基本操作 \0I_<
1、java数据库操作基本流程 n;C
:0
2、几个常用的重要技巧: l0w]`EE
可滚动、更新的记录集 {
Fb*&|-n
批量更新 T_
<@..C
事务处理 l^-];|Y
oUr66a/[U
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 v2\FA(BPn
1、取得数据库连接 J T7nG.9
1)用DriverManager取数据库连接 ")5":V~fN
例子 r:'.nhe
String className,url,uid,pwd; {n.PF8A5X
className = "oracle.jdbc.driver.OracleDriver"; 9dLV96
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; M}-Rzc
uid = "system"; 2'\H\|
pwd = "manager"; G]tn i
Class.forName(className); Xp% v.M
Connection cn = DriverManager.getConnection(url,uid,pwd); Rz/gtEP
2)用jndi(java的命名和目录服务)方式 e@07
例子 E \EsWb
String jndi = "jdbc/db"; ^_W#+>&--
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); J#(LlCs?@c
DataSource ds = (DataSource) ctx.lookup(jndi); t+G#{n
Connection cn = ds.getConnection(); 9uO 2Mm
多用于jsp中 .},'~NM]
2、执行sql语句 w<3#1/g!2B
1)用Statement来执行sql语句 ~?Pw& K2
String sql; SmH=e@y~Lx
Statement sm = cn.createStatement(); I)[DTCJ~
sm.executeQuery(sql); // 执行数据查询语句(select) 1{.|+S Z!
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ^|>PA:%
2)用PreparedStatement来执行sql语句 ]Sz:|%JP1
String sql; uym*a4J
sql = "insert into user (id,name) values (?,?)"; yYYSeH
PreparedStatement ps = cn.prepareStatement(sql); At>DjKx]O
ps.setInt(1,xxx); g%I"U>!2
ps.setString(2,xxx); g2ixx+`?|:
... djG*YM\B
ResultSet rs = ps.executeQuery(); // 查询 h"Q8b}$^)
int c = ps.executeUpdate(); // 更新 `25yE/
=R|HV;9 h
3、处理执行结果 pa3{8x{9m
查询语句,返回记录集ResultSet uyWunpT
更新语句,返回数字,表示该更新影响的记录数 [yQt^!;
ResultSet的方法 KYI/
1、next(),将游标往后移动一行,如果成功返回true;否则返回false JR21>;l#2
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 P4'Q/Sj
&`r-.&Y
4、释放连接 q3N
jky1w
cn.close(); k%#EEMh
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ..5CC;B
@Uvz8*b6
可滚动、更新的记录集 _6hQ %hv8
1、创建可滚动、更新的Statement G~[x
3L'
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); |aS.a&vwR
该Statement取得的ResultSet就是可滚动的 Q"d^_z]K
2、创建PreparedStatement时指定参数 MJO-q $)c
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
ltSU fI
ResultSet.absolute(9000); JFmC\
批量更新 G>}255qY
1、Statement .`H5cuF`
Statement sm = cn.createStatement(); U'_Q>k
sm.addBatch(sql1); ec;o\erPG
sm.addBatch(sql2); ~,Ix0h+H+M
... ^uc=f2=>,
sm.executeBatch() |>^JRx
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 %aCqi(.7
2、PreparedStatement G~a ZJ,
PreparedStatement ps = cn.preparedStatement(sql); ebhXak[w
{ Ll't>)
ps.setXXX(1,xxx); 2l'6.
... *N<]Xy@
ps.addBatch(); K5h
} c)85=T6*aA
ps.executeBatch(); (%6P0*
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 'H>^2C iM
RtS+<^2a;
事务的处理 2F.;;Ab
1、关闭Connection的自动提交 @,+5y\]C
cn.setAutoCommit(false); ]%H`_8<gc
2、执行一系列sql语句 hn@08t G
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close _TZRVa_
Statement sm ; JH9J5%sp
sm = cn.createStatement(insert into user...); kDioD
sm.executeUpdate(); !Ai@$tl[S
sm.close(); (w3YvG.
sm = cn.createStatement("insert into corp...); _V6ukd"B~
sm.executeUpdate(); ouQ T
sm.close(); 03Ycf'W
3、提交 g3y~bf
cn.commit(); {!L~@r
4、如果发生异常,那么回滚 0{D'n@veP
cn.rollback();