java 数据库基本操作 y,V6h*x2
1、java数据库操作基本流程 y]7%$*
<
2、几个常用的重要技巧: @ "0uM?_)-
可滚动、更新的记录集 `ReGnT[
批量更新 6UO$z- e
事务处理 yYM_lobn
R qnWtE
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 v`
$%G
1、取得数据库连接 {wHvE4F2
1)用DriverManager取数据库连接 C_-%*]*,j
例子 i`R(7Z
String className,url,uid,pwd; 8<Xq=*J+
className = "oracle.jdbc.driver.OracleDriver"; }|SIHz!R
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; f&f`J/(
uid = "system"; NtqFnxm/
pwd = "manager"; lS#7xh
Class.forName(className); B#QL M^
Connection cn = DriverManager.getConnection(url,uid,pwd); Q7L)f71i
2)用jndi(java的命名和目录服务)方式 3Fgz)*Gu]
例子 }'PG!+=I
String jndi = "jdbc/db"; 2G
ZF/9}
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); $,.3&zsy
DataSource ds = (DataSource) ctx.lookup(jndi); zUJx&5/
Connection cn = ds.getConnection(); &yB%QX{3
多用于jsp中 Bpm,mp4g\#
2、执行sql语句 ~m!#FTc*
1)用Statement来执行sql语句 (x}A_i
String sql; >B`Cch/'U
Statement sm = cn.createStatement(); g
,`F<CF9
sm.executeQuery(sql); // 执行数据查询语句(select) xna7kA
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); o
T:j:n
2)用PreparedStatement来执行sql语句 J_|7$
l/
String sql; F|6
nwvgq
sql = "insert into user (id,name) values (?,?)"; 9U&~(;
PreparedStatement ps = cn.prepareStatement(sql); Y$>+U
ps.setInt(1,xxx); E1#H{)G
ps.setString(2,xxx); WUzSlZq
... XMomFW_@
ResultSet rs = ps.executeQuery(); // 查询 NWw<B3aL
int c = ps.executeUpdate(); // 更新 h|K\z{ A
c^rC8E
3、处理执行结果 =n)JJS94
查询语句,返回记录集ResultSet L^6"'#
更新语句,返回数字,表示该更新影响的记录数 aXQ&@BZ{j
ResultSet的方法 3T"2S[gT
1、next(),将游标往后移动一行,如果成功返回true;否则返回false w8G7Jy
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Tc9&mKVE%(
2XzF k_6H
4、释放连接 >y]?MGk
cn.close(); "tfn?n0
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection rFf:A-#l
;9}w|!/
可滚动、更新的记录集 mluW=fE
1、创建可滚动、更新的Statement NAJ '><2
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); lB=(8.
该Statement取得的ResultSet就是可滚动的 km9Gwg/zT
2、创建PreparedStatement时指定参数 2=jd;2~
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); X";TZk
ResultSet.absolute(9000); >Dk1axZ!>/
批量更新 EV:_Kx8f P
1、Statement 2j2mW>Z
Statement sm = cn.createStatement(); 0Ulxp
sm.addBatch(sql1); 9
aY'0wa
sm.addBatch(sql2); c]GQU
... DxE(9j
sm.executeBatch() AqKHjCI
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 <9=zP/Q
2、PreparedStatement >Kz_My9
PreparedStatement ps = cn.preparedStatement(sql); Xq+!eOT
{ %=laY_y
G
ps.setXXX(1,xxx); 1R5Yn(
... d&/^34gn
ps.addBatch(); =AWX
+znP
} &B?@@6
ps.executeBatch(); <l*agH-.3
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 -0{T
3yeK@>C
事务的处理 ) ~ l\
1、关闭Connection的自动提交 Su$18a"Bc
cn.setAutoCommit(false); Tm(Q@
2、执行一系列sql语句 += X).X0K
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close !x`;>0
Statement sm ; 7xX;MB&
sm = cn.createStatement(insert into user...); "2*G$\
sm.executeUpdate(); t.3Ct@wK
sm.close(); 83mlZ1jQz
sm = cn.createStatement("insert into corp...); N7d17c.
5
sm.executeUpdate(); 6"BtfQ")
sm.close(); |Dl*w/n
3、提交 l0qdk#v
cn.commit(); jjJc1 p0
4、如果发生异常,那么回滚 H+S~ bzz
cn.rollback();