java 数据库基本操作 gxycw4kz
1、java数据库操作基本流程 !E'jd72O
2、几个常用的重要技巧: ]/XNfb
可滚动、更新的记录集 ^D/:[
批量更新 MW &iNioX
事务处理 Q4JwX=ZVj
5#p [Q _
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 .36z
1、取得数据库连接 rg]eSP3W
1)用DriverManager取数据库连接 r77?s?
例子 qhRs5QXL
String className,url,uid,pwd; T_lexX[\
className = "oracle.jdbc.driver.OracleDriver"; (x2I*<7P
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 5 S$*YRp
uid = "system"; 4(B{-cK
pwd = "manager"; Z,.*!S=?h
Class.forName(className); Vf`n>
Connection cn = DriverManager.getConnection(url,uid,pwd); m,K0BL
2)用jndi(java的命名和目录服务)方式 BI?M/pIm
例子 g<-x"$(C&
String jndi = "jdbc/db"; f>g>7OsD]
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); {a- p/\U
DataSource ds = (DataSource) ctx.lookup(jndi); S^HuQe!#
Connection cn = ds.getConnection(); I
$!Y
多用于jsp中 4E}]>
2、执行sql语句 r5xu#%hgp;
1)用Statement来执行sql语句 r]iec{ ^
String sql; _'JKPD[
Statement sm = cn.createStatement(); Xhe2 5
sm.executeQuery(sql); // 执行数据查询语句(select) MR=>DcR
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); zHw[`"[
2)用PreparedStatement来执行sql语句 #(FG+Bk
String sql; +e. bO5Y
sql = "insert into user (id,name) values (?,?)"; pP;GDW4
PreparedStatement ps = cn.prepareStatement(sql); D:sQHJ.y
ps.setInt(1,xxx); v4kk4}lE
ps.setString(2,xxx); r3<yG"J86
... ?*zRM?*
ResultSet rs = ps.executeQuery(); // 查询 u* G|TF
int c = ps.executeUpdate(); // 更新 ev7Y^
y+\nj3v6
3、处理执行结果 d\WnuQR[
查询语句,返回记录集ResultSet ZC'(^liAp
更新语句,返回数字,表示该更新影响的记录数 `So*\#\T
ResultSet的方法 `{s:lf
1、next(),将游标往后移动一行,如果成功返回true;否则返回false _V^^%$
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 3N|,c]|
T.HS.
4、释放连接 x>m_ v
cn.close(); #8z2>&:|
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection yeqZPzn
W6_/FkO
可滚动、更新的记录集 (0g@Z`r
1、创建可滚动、更新的Statement YQxVeS(
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); \74+ cN
该Statement取得的ResultSet就是可滚动的 ";AM3
2、创建PreparedStatement时指定参数 PXz,[<ET?#
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); hJ 4]GA'
ResultSet.absolute(9000); yxh8sAZ
批量更新 Z.Z+cFi
1、Statement TXD\i Dq
Statement sm = cn.createStatement(); V4ml& D
sm.addBatch(sql1); JL45!+
sm.addBatch(sql2); T},Nqt<
... OV8Y)%t"
sm.executeBatch() xG@zy4
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 [vV]lWOp'
2、PreparedStatement fmILkXKz
PreparedStatement ps = cn.preparedStatement(sql); dp\pkx7
{ M^DYzJ
ps.setXXX(1,xxx); =t\HtAXn[
... $q);xs
ps.addBatch(); w0(A7L:L
} xH#R_
ps.executeBatch(); 9IZ}}x
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 UmZ#Cm
pwU
l&hwte
事务的处理 fx2r\ usX[
1、关闭Connection的自动提交 QL%&b\K
cn.setAutoCommit(false); &$ZJfHD@
2、执行一系列sql语句 NCbn<ojb
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close xhLVLXZ9
Statement sm ; #9uNJla
sm = cn.createStatement(insert into user...); ,r!_4|\
sm.executeUpdate(); $e1==@
R
sm.close(); GY%lPp
sm = cn.createStatement("insert into corp...); Z_Ffiw(p
sm.executeUpdate(); MgyV{`
sm.close(); AAUFX/}8P
3、提交 A
J<Sa=
cn.commit(); 6 Ty;m>j
4、如果发生异常,那么回滚 ?G%C}8a
cn.rollback();