java 数据库基本操作 kj[[78
1、java数据库操作基本流程 :Rq D0>1
2、几个常用的重要技巧: ~C[,P\,
可滚动、更新的记录集 5|/vc*m_0'
批量更新 m1cyCD
事务处理 nQgn^z#
7z$+ *]9-
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 v:+se6HY?p
1、取得数据库连接 6$zUFIk
1)用DriverManager取数据库连接 <&NR3^Eq
例子 XYn$yR\dj
String className,url,uid,pwd; qlzL<
className = "oracle.jdbc.driver.OracleDriver"; K[9 <a>D`
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; {<i!Pm
uid = "system"; ?@XO*|xkSk
pwd = "manager"; *7Mrng
Class.forName(className); II2oV}7?
Connection cn = DriverManager.getConnection(url,uid,pwd); (O&b:D/Y
2)用jndi(java的命名和目录服务)方式 ;uJVY)7a
例子 x_Z~k
String jndi = "jdbc/db"; 6ZM<M7(V
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); @3G3l|~>
DataSource ds = (DataSource) ctx.lookup(jndi); q}8R>`Z{
Connection cn = ds.getConnection(); ~!uK;hI
多用于jsp中 `j2z=5
2、执行sql语句 6m{3GKaW~
1)用Statement来执行sql语句 63~i6
String sql; ,5/gNg
Statement sm = cn.createStatement(); leiza?[
sm.executeQuery(sql); // 执行数据查询语句(select) SQHVgj
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); |ST&,a$(
2)用PreparedStatement来执行sql语句 =]"PSY7p
String sql; abF_i#
sql = "insert into user (id,name) values (?,?)"; M"J$c42
PreparedStatement ps = cn.prepareStatement(sql); bySw#h_
ps.setInt(1,xxx); aJfW75C
ps.setString(2,xxx); sI.Ezuw
... Q'rG' |
ResultSet rs = ps.executeQuery(); // 查询 ugL$W@
int c = ps.executeUpdate(); // 更新 rN*4Y
"44X'G8N
3、处理执行结果 `Ffn:=Do
查询语句,返回记录集ResultSet \t(/I=E8/
更新语句,返回数字,表示该更新影响的记录数 mT9TSW}
ResultSet的方法 R{WG>c
1、next(),将游标往后移动一行,如果成功返回true;否则返回false $`riB$v
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ^yfT7050
P--#5W;^oB
4、释放连接 0 8U:{LL
cn.close(); t4Z.b 5g
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection cBAA32wf
m3,v&Z
可滚动、更新的记录集 +[>m`XTq
1、创建可滚动、更新的Statement 2qEy"DKu
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); mbd@4u
该Statement取得的ResultSet就是可滚动的 4u;W1=+Vn
2、创建PreparedStatement时指定参数 w ggl,+7
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); `yf#(YP
ResultSet.absolute(9000); _LS=O@s^
批量更新 4}0s^>R
1、Statement rj6wKfz
Statement sm = cn.createStatement(); 0)nU[CY
sm.addBatch(sql1); J"z8olV
sm.addBatch(sql2); 3}sd%vCK
... APF-*/K?
sm.executeBatch() m!PN1$9V
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 @Pa ;h
2、PreparedStatement FPu,sz8
PreparedStatement ps = cn.preparedStatement(sql); !W6]+
{ [#.QDe
ps.setXXX(1,xxx); tIRw"sz
... i#eb %9Mn
ps.addBatch(); a~{mRh
} N".
af)5
ps.executeBatch(); HWc=.Qq
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 8'f:7KF
t[X'OK0W%3
事务的处理 +DU}f;O8v
1、关闭Connection的自动提交 8J@REP4
cn.setAutoCommit(false); jbG #__#_
2、执行一系列sql语句 ~< k'{
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 8J>s|MZ
Statement sm ; {!<zk+h$
sm = cn.createStatement(insert into user...); PB`94W
sm.executeUpdate(); )Z]8SED
sm.close(); 9 Z4H5!:(
sm = cn.createStatement("insert into corp...);
T%:}/@
sm.executeUpdate(); PsTwJLY
sm.close(); qEywExdiu
3、提交 <8'}H`w%
cn.commit(); l.&6|
4、如果发生异常,那么回滚 0uj3kr?cv
cn.rollback();