java 数据库基本操作 ,~(}lvqVH
1、java数据库操作基本流程 kB#vh
2、几个常用的重要技巧: )AXH^&
可滚动、更新的记录集 -QDgr`%5
批量更新 6/ipdi[
_
事务处理 \DK*>
k
&,]+>
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 D|9fHMg%
1、取得数据库连接 vWs c{9
1)用DriverManager取数据库连接 (}1f]$V
例子 VAGMI+ -
String className,url,uid,pwd; 4tJ4X' U
className = "oracle.jdbc.driver.OracleDriver"; 0!`7kZrN
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ~e9INZe-j
uid = "system"; !U:s.^{
pwd = "manager"; ecpUp39\
Class.forName(className); y#;VGf6lj
Connection cn = DriverManager.getConnection(url,uid,pwd); ~79Qg{+]N
2)用jndi(java的命名和目录服务)方式 Tj5@OcA$
例子 J5_Y\@
String jndi = "jdbc/db"; WG} CPkj
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); E^a`IA
DataSource ds = (DataSource) ctx.lookup(jndi); X@U1Ri
Connection cn = ds.getConnection(); CL :M>(
多用于jsp中 Ag0_^
2、执行sql语句 8p{
1)用Statement来执行sql语句 Gcz@ze
String sql; z/k~+-6O
Statement sm = cn.createStatement(); &\|<3sd(
sm.executeQuery(sql); // 执行数据查询语句(select) Lo E(W|nj
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); <Cu?$
2)用PreparedStatement来执行sql语句 e-3pg?M
String sql; O&iYGREO
sql = "insert into user (id,name) values (?,?)"; G D{fXhgk
PreparedStatement ps = cn.prepareStatement(sql); kDY]>v
ps.setInt(1,xxx); `yX+NRi(s
ps.setString(2,xxx); eZ5}O0sfp
... T,2Dr;
ResultSet rs = ps.executeQuery(); // 查询 2%C5P0;QX
int c = ps.executeUpdate(); // 更新 7u5\#|yL
u%T$XG
3、处理执行结果 %yM'
Z[-
查询语句,返回记录集ResultSet N 3p 7 0
更新语句,返回数字,表示该更新影响的记录数 ."Ix#\|x
ResultSet的方法 IPi<sE
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ugCS &
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 h?3l
Ny,A#-?
4、释放连接 )-KE 4/G
cn.close(); m_02"'
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection tO>OD#
H9Q7({v
可滚动、更新的记录集 uf'P9MA}>
1、创建可滚动、更新的Statement 8pMZ~W;
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); `W$0T;MPF
该Statement取得的ResultSet就是可滚动的 ?En|
_E_C
2、创建PreparedStatement时指定参数 &Z;8J @
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); RG
r'<o )
ResultSet.absolute(9000); Po11EZa$a
批量更新 -s%-*K+,W
1、Statement GL =XiBt
Statement sm = cn.createStatement(); s8Ry}{
sm.addBatch(sql1); V/9"Xmv75
sm.addBatch(sql2); ro^6:w3O^
... "Xk%3\{P
sm.executeBatch() +M
O5'z
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 J*~2:{=%
2、PreparedStatement gq_7_Y/
PreparedStatement ps = cn.preparedStatement(sql); j /dE6d
{
p $1Rgm\
ps.setXXX(1,xxx); ?Ga2K
... #C;zS9(]B
ps.addBatch(); ]n]uN~)9
} dFP-(dX#
ps.executeBatch(); |k
.M+
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 @W\4UX3dK
ddq 1NW
事务的处理 1;:t~Y
1、关闭Connection的自动提交 @23RjoK
cn.setAutoCommit(false); gLSG:7m@
2、执行一系列sql语句 `TD%M`a
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ?I2k6%a
Statement sm ; ?WQd
sm = cn.createStatement(insert into user...); Fr3d#kVR
sm.executeUpdate(); pG F5aF7T
sm.close(); CziaxJ
sm = cn.createStatement("insert into corp...); x"llX
sm.executeUpdate(); g[wP!y%V
sm.close(); *JY`.t
3、提交 O})u'
cn.commit(); N~S[xS?
4、如果发生异常,那么回滚 0I>?_?~l6
cn.rollback();