java 数据库基本操作 y f+/Kj<
a
1、java数据库操作基本流程 uMqo)J@s
2、几个常用的重要技巧: jRq>Sz{8
可滚动、更新的记录集 7i/?+|
批量更新 (mz a&WF7
事务处理 J-I7K!B
L'['7
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 dmE-WS
1、取得数据库连接 W:0@m^r
1)用DriverManager取数据库连接 Txw,B2e)>
例子 Rmd;ug9
String className,url,uid,pwd; GbNVcP.ocP
className = "oracle.jdbc.driver.OracleDriver"; y< 146
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Vw)\#6FL
uid = "system"; P7@qvg
pwd = "manager"; E[_Z%zd^
Class.forName(className); OjZ+gl}
Connection cn = DriverManager.getConnection(url,uid,pwd); v3aiX
2)用jndi(java的命名和目录服务)方式 Wxp^*._q3I
例子 VMtR4! :q
String jndi = "jdbc/db"; ]HCt%5
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ]A'e+RD4k
DataSource ds = (DataSource) ctx.lookup(jndi); O
gycP4z[
Connection cn = ds.getConnection(); ~8|$KD4I
多用于jsp中 0>.'w\,87B
2、执行sql语句 )EcF[aO
1)用Statement来执行sql语句 $'[(
DwLS
String sql; ][_:{ N/
Statement sm = cn.createStatement(); 9$d (`-&9p
sm.executeQuery(sql); // 执行数据查询语句(select) L!e@T'
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ?|8H$1
2)用PreparedStatement来执行sql语句 :Eob"WH
String sql; ew"[]eZ:ut
sql = "insert into user (id,name) values (?,?)"; N*o+m~:y
PreparedStatement ps = cn.prepareStatement(sql); &O!d!Pf
ps.setInt(1,xxx); u,'c:RMV
ps.setString(2,xxx); flmcY7ZV
... TYLf..i<
ResultSet rs = ps.executeQuery(); // 查询 3-_4p8OK
int c = ps.executeUpdate(); // 更新 kW/ksz0)
Uvz9x"0[u
3、处理执行结果 H[6d@m- Z
查询语句,返回记录集ResultSet B;rq{ac!P]
更新语句,返回数字,表示该更新影响的记录数 g\6(ezUF*
ResultSet的方法 *!nS4[d
1、next(),将游标往后移动一行,如果成功返回true;否则返回false %0"o(y+zt
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 RNIfw1R
K$K[fcj
4、释放连接 sQt@B#;
cn.close(); 2f~s$I&l#
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Ie+z"&0
{~d4;ht1Y
可滚动、更新的记录集 ^(6.P)$
1、创建可滚动、更新的Statement 4I2ppz
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Q0M8}
该Statement取得的ResultSet就是可滚动的 -|ee=BV
2、创建PreparedStatement时指定参数 `d8$OC
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); tU?lfU[7
ResultSet.absolute(9000); ,,,5pCi\
批量更新 3EzI~Zsx
1、Statement
G%4vZPA
Statement sm = cn.createStatement(); VoP(!.Ua>7
sm.addBatch(sql1); i44KTC"sB
sm.addBatch(sql2); ,cj34W`FWq
... iF`E>%#
sm.executeBatch() 'RG`DzuF
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 3 #jPQ[+
2、PreparedStatement >0~y"~M
PreparedStatement ps = cn.preparedStatement(sql); tb_}w@:kU
{ 2>s:wABb /
ps.setXXX(1,xxx); Ou,B3kuQ+
... ."=Bx2
ps.addBatch(); irrQ$N}
} sy]1Ba%
ps.executeBatch(); )|2g#hH5
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 7$b78wax
$r_z""eOc
事务的处理 `cVG_=2
1、关闭Connection的自动提交 2"%d!"
cn.setAutoCommit(false); B\N,%vsx#U
2、执行一系列sql语句 \7Zk[)!FL
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close i;Gl-b\_h
Statement sm ; ;1F3.ibE
sm = cn.createStatement(insert into user...); jIuE1ve
sm.executeUpdate(); k deJB-
sm.close(); !5p01]7
sm = cn.createStatement("insert into corp...); 7(wY4T
sm.executeUpdate(); H# Vs3*VK
sm.close(); 0R*!o\y
3、提交 1k
"*@Z<
cn.commit(); ukhI'alS,
4、如果发生异常,那么回滚 |ukEnjI`u
cn.rollback();