java 数据库基本操作 <5!RAdaj+
1、java数据库操作基本流程 L2/<+Zw
2、几个常用的重要技巧: G(Idiw#WT
可滚动、更新的记录集 pRk'GR]`
批量更新 _uy5?auQ
事务处理 ''\cBM!
1
Q0Yer
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 .>gU
9A(Nk
1、取得数据库连接 1!v >I"]
1)用DriverManager取数据库连接 Z+"E*
例子 5x1jLPl'
String className,url,uid,pwd; 3/SqXu
className = "oracle.jdbc.driver.OracleDriver"; v_1JH<GJ-
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; b#\kZ/W
uid = "system"; -~Z@,
pwd = "manager"; 9T0wdK]
Class.forName(className); J1y2Qw$G
Connection cn = DriverManager.getConnection(url,uid,pwd); 9OJ\n|,(
2)用jndi(java的命名和目录服务)方式 y
4,T
例子 s$nfY.C
String jndi = "jdbc/db"; pg}DC0a
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); MS*Mem,
DataSource ds = (DataSource) ctx.lookup(jndi); \Dsl7s=
Connection cn = ds.getConnection(); as!|8JE`
多用于jsp中 I`n1M+=%
2、执行sql语句 +IOKE\,Y
1)用Statement来执行sql语句 ]zM90$6
String sql; -"JE-n
Statement sm = cn.createStatement(); )V+Dqh,-g
sm.executeQuery(sql); // 执行数据查询语句(select) :EldP,s#x%
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ,9l!fT?iH
2)用PreparedStatement来执行sql语句 '$L= sH5
String sql; <&m
sql = "insert into user (id,name) values (?,?)"; 3Ns:O2|
PreparedStatement ps = cn.prepareStatement(sql); /*R' xBr
ps.setInt(1,xxx); G3?a~n^b
ps.setString(2,xxx); $gD(MKR)~
... s7)# NT2
ResultSet rs = ps.executeQuery(); // 查询 =ILo`Q~
int c = ps.executeUpdate(); // 更新 7[?}kG
>8mW-p
3、处理执行结果 #<V'gE
查询语句,返回记录集ResultSet 5bqYi
更新语句,返回数字,表示该更新影响的记录数 4#Nd;gM2
ResultSet的方法 {Z~VO
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 9787uj]Y}H
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 %!hA\S
}y=n#%|i.
4、释放连接 k3|9U'r!c
cn.close(); b!tZ bX#
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection E6&uZr
W,oV$ s^
可滚动、更新的记录集 +iDz+3v(
1、创建可滚动、更新的Statement 8#JyK+NU
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); wYxFjXm
该Statement取得的ResultSet就是可滚动的 >8HRnCyp/
2、创建PreparedStatement时指定参数 +w}%gps
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); (S93 %ii
ResultSet.absolute(9000); Z YO/'YW
批量更新 P*^UU\x'4I
1、Statement GMp'KEQQ
Statement sm = cn.createStatement(); ^~kFC/tQ
sm.addBatch(sql1); "@<g'T0
sm.addBatch(sql2); /)<7$
... 0BwQ!B.
sm.executeBatch() @md^mss
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 w\Eve:
2、PreparedStatement Erymx$@P
PreparedStatement ps = cn.preparedStatement(sql); C g,w6<7
{ %RF
ps.setXXX(1,xxx); BOcEL%+
... _"e(
^yiK
ps.addBatch(); vH:+
} KB-#):'
ps.executeBatch(); KqIe8bi^G
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 gRd1(S
7^}Z%c
事务的处理 ea;c\84_N
1、关闭Connection的自动提交 -`<N,
cn.setAutoCommit(false); X/D9%[{&
2、执行一系列sql语句 Dg4^
C
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close bX1! fa
Statement sm ; RPqn#B
sm = cn.createStatement(insert into user...); u6&Ixi/s'
sm.executeUpdate(); j:<T<8.o
sm.close(); si4=C
sm = cn.createStatement("insert into corp...); w0>)y-
sm.executeUpdate(); [~H`9Ab=
sm.close(); 3mn-dKe((
3、提交 $R}iL
cn.commit(); Y7I
4、如果发生异常,那么回滚 .cK
cn.rollback();