java 数据库基本操作 9h90huyKF
1、java数据库操作基本流程 n]_[NR) i
2、几个常用的重要技巧: UV
4>N
可滚动、更新的记录集 gbeghLP[?
批量更新 /I5X"x
事务处理 |'ln?D:&
n6d9\
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 V"o7jsFH6n
1、取得数据库连接 7\zZpPDV
1)用DriverManager取数据库连接
JCcZuwu[
例子 9fnA
String className,url,uid,pwd; =h6
sPJ
className = "oracle.jdbc.driver.OracleDriver"; /M~!sPW&?
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; %
}|cb7l
uid = "system"; <:/&&@2
pwd = "manager";
XIo55*
Class.forName(className); enNiI$H]`_
Connection cn = DriverManager.getConnection(url,uid,pwd); 93qwH%
2)用jndi(java的命名和目录服务)方式 `!:q;i]}
例子 1% F?B-k
String jndi = "jdbc/db"; r"2V
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 7'-Lp@an
DataSource ds = (DataSource) ctx.lookup(jndi); 9j]sD/L5q
Connection cn = ds.getConnection(); HmfG$Z
多用于jsp中 X:a`B(@S
2、执行sql语句 N..j{FE
1)用Statement来执行sql语句 /yz=Cj oz
String sql; L9Z;:``p
Statement sm = cn.createStatement(); Rgo rkZlVM
sm.executeQuery(sql); // 执行数据查询语句(select) l\AMl
\
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); _I`,Br:N
2)用PreparedStatement来执行sql语句 heaR X4
String sql; U-k+9f 0
sql = "insert into user (id,name) values (?,?)"; UX3BeUi.)
PreparedStatement ps = cn.prepareStatement(sql); ;@,Q&B2eM
ps.setInt(1,xxx); 07Gv* .
ps.setString(2,xxx); w;}@'GgL
... `~eX55W
ResultSet rs = ps.executeQuery(); // 查询 h)1qp Qj
int c = ps.executeUpdate(); // 更新 c^rOImZ
9=w|)p )
3、处理执行结果 +uWDP.
查询语句,返回记录集ResultSet "'8KV\/D
更新语句,返回数字,表示该更新影响的记录数 .@-9'<K?~
ResultSet的方法 ML-)I&>tT
1、next(),将游标往后移动一行,如果成功返回true;否则返回false |4mpohX
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Cz4)Yz
`b8v1Os^2
4、释放连接 +')f6P;t>=
cn.close(); =cN&A_L(
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Y={&5Mir
Rj F'x
可滚动、更新的记录集 G$'jEa<:u
1、创建可滚动、更新的Statement ri`R<l8
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); $@d9<83=
该Statement取得的ResultSet就是可滚动的 d_n7k g+
2、创建PreparedStatement时指定参数 ;N B:e
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); <2!v(EkI
ResultSet.absolute(9000); >{eCh$L
批量更新 nzjkX4KV
1、Statement O%1v)AT&\
Statement sm = cn.createStatement(); ^JI o?R
sm.addBatch(sql1); i,V;xB2
sm.addBatch(sql2); nJRS.xs
... ^l^fD t
sm.executeBatch() J$4wL
F3
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 H/M Au7
2、PreparedStatement Z3k(P
PreparedStatement ps = cn.preparedStatement(sql); /vY_Y3k#
{ !3mA0-!+
ps.setXXX(1,xxx); I -Xlx<
... 6:U$w7P0
e
ps.addBatch(); =ji1S}e~p
} lPLz@Up~
ps.executeBatch(); _|72r}j
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 A^ _a3$,0
OA:%lC!
事务的处理 {T"0DSV
1、关闭Connection的自动提交 h2ZkCML
cn.setAutoCommit(false); |/gW_;(
2、执行一系列sql语句 -~eJn'W
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close mcz+P |
Statement sm ; f:g,_|JD$
sm = cn.createStatement(insert into user...); 7NC=*A~
sm.executeUpdate(); < B_Vc:Q
sm.close(); K =.%$A
sm = cn.createStatement("insert into corp...); w;Q;[:y
sm.executeUpdate(); s[8@*/ds
sm.close(); 2&+#Vsm`V
3、提交 Auy_K?he]
cn.commit(); ZcuA6#3B
4、如果发生异常,那么回滚 \MxoZ
cn.rollback();