java 数据库基本操作 fGf C[DuY
1、java数据库操作基本流程 MJ%gF=$X
2、几个常用的重要技巧: {K,KIj"
可滚动、更新的记录集 "d3qUk
批量更新 /4xp?Lo:
事务处理 w(6(Fze
0hCrEM!8
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 zZh\e,*
1、取得数据库连接 .ou#BWav/
1)用DriverManager取数据库连接 0*4h}t9j
例子 "Vw;y+F}
String className,url,uid,pwd; WU:r:m+
>
className = "oracle.jdbc.driver.OracleDriver"; ;zpSyyp@
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 13f@Ox$
uid = "system"; iC`mj
pwd = "manager"; J;R1OJs S
Class.forName(className); jb'AOs
Connection cn = DriverManager.getConnection(url,uid,pwd); RIg
`F#,3
2)用jndi(java的命名和目录服务)方式
:}n\
r/i
例子 $Y3mO~
String jndi = "jdbc/db"; #ouE,<
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Pkq?tm$#
DataSource ds = (DataSource) ctx.lookup(jndi); }b$W+/M\
Connection cn = ds.getConnection(); nyRQ/.3
多用于jsp中 U%qE=u-
2、执行sql语句 3B^`xnV
1)用Statement来执行sql语句 M[}aQWT$v
String sql; (Z)F6sZ`8
Statement sm = cn.createStatement(); 2$@N4
sm.executeQuery(sql); // 执行数据查询语句(select) H6Dw5vG"l
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); m.':5
2)用PreparedStatement来执行sql语句 ]hC6PKJU
String sql; MEled:i
sql = "insert into user (id,name) values (?,?)"; o
00(\ -eb
PreparedStatement ps = cn.prepareStatement(sql); R>CIEL
ps.setInt(1,xxx); 6
h%%?
ps.setString(2,xxx); \[CPI`yQe
... h!4jl0oX]
ResultSet rs = ps.executeQuery(); // 查询 2g`<*u*
int c = ps.executeUpdate(); // 更新 qTV;L-
->q^$#e
3、处理执行结果 {g@?\
查询语句,返回记录集ResultSet wBaIN]Y,
更新语句,返回数字,表示该更新影响的记录数 dPx{9Y<FzU
ResultSet的方法 rd\:.
1、next(),将游标往后移动一行,如果成功返回true;否则返回false iQ7S*s+l5O
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 56JvF*hP
LagHzCB
4、释放连接 ,+mH1#-3
cn.close(); rq]zt2
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection
#l<un<
9irT}e
可滚动、更新的记录集 tOEY|
1、创建可滚动、更新的Statement mcgkNED
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); \])-Bp,
该Statement取得的ResultSet就是可滚动的 ob(S/t
2、创建PreparedStatement时指定参数 +jifbf-
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); f *HEw
ResultSet.absolute(9000); 'G>gNq
批量更新 (h$[g"8
1、Statement i7#PYt
Statement sm = cn.createStatement(); Q}qw`L1
sm.addBatch(sql1); O% }EpIP_
sm.addBatch(sql2); K|Kc.
... NB@TyU
sm.executeBatch() #eZm)KFQg
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 E{B8+T:3
2、PreparedStatement Zp'q;h_
PreparedStatement ps = cn.preparedStatement(sql); K>_~zW nc
{ Dqz9NB
ps.setXXX(1,xxx); *F)+- BB
... ]@G$L,3
ps.addBatch(); 5 52U~t
} ) h>H}wDs
ps.executeBatch(); )i$:iI
>k
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 QswbIP/>:'
Lo-\;%y
事务的处理 =e j'5m($3
1、关闭Connection的自动提交 _O w]kP='
cn.setAutoCommit(false); .`;
bQh'!
2、执行一系列sql语句 6%Ws>H4@|
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close "%[a Wb
Statement sm ; |u5Xi5q.f
sm = cn.createStatement(insert into user...); I4RUXi 5
sm.executeUpdate(); M%S.Z4D
(0
sm.close(); |Js?@
sm = cn.createStatement("insert into corp...); -Rcl(Q}LZ
sm.executeUpdate(); 3`%U)gCT5
sm.close(); 3l?-H|T
3、提交 A
KjCm*K(q
cn.commit(); YuVg/ '=
4、如果发生异常,那么回滚 ^.:dT?@R
cn.rollback();