java 数据库基本操作 m{Q
#f\<
1、java数据库操作基本流程 b}K,wAx
2、几个常用的重要技巧: ?4b0\ -
可滚动、更新的记录集 -Uo11'{
批量更新 i=gZ8Q=H
事务处理 ,#)d
Lk(ESV;r
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 o Xm
!
1、取得数据库连接 IXy6Yn9l
1)用DriverManager取数据库连接 oqJYbim
例子 EOB8|:*
String className,url,uid,pwd; ,31 ?
Aa
className = "oracle.jdbc.driver.OracleDriver"; /s4~Ij`be
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; %B$ftsYXmu
uid = "system"; RIMSXue*Ha
pwd = "manager"; yx]9rD1cz
Class.forName(className); P{o)Ir8Tt
Connection cn = DriverManager.getConnection(url,uid,pwd); ^QS`H@+Z
2)用jndi(java的命名和目录服务)方式
(Q8!5s
例子 G8av5zR
String jndi = "jdbc/db"; 2{=]Pf
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 4zyQ "?A~
DataSource ds = (DataSource) ctx.lookup(jndi); 1iF=~@Nz_
Connection cn = ds.getConnection(); Pe_O(
多用于jsp中 "Vp
nr +6
2、执行sql语句 9B0ON*`
1)用Statement来执行sql语句 :H]d1
String sql; 4#IT" i
Statement sm = cn.createStatement(); 2VN].t:
sm.executeQuery(sql); // 执行数据查询语句(select) #gC[L=01
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ?EFRf~7JP
2)用PreparedStatement来执行sql语句
G[k3`
String sql; e0`z~z]6&
sql = "insert into user (id,name) values (?,?)"; hY&Yp^"}]^
PreparedStatement ps = cn.prepareStatement(sql); ^-"Iwy
ps.setInt(1,xxx); "9caoPI0~
ps.setString(2,xxx); Q!+AiSTU
... vG_R( ]d
ResultSet rs = ps.executeQuery(); // 查询 @62,.\F
int c = ps.executeUpdate(); // 更新 EZ<:>V-_D
'zYS:W
3、处理执行结果 MJGT|u8O&
查询语句,返回记录集ResultSet wMVUTm
更新语句,返回数字,表示该更新影响的记录数 91]|4k93
ResultSet的方法
n4{%M
1、next(),将游标往后移动一行,如果成功返回true;否则返回false +9Tc.3vQ
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 EVPQe-
pCE
GZV,d@
4、释放连接 B7f<XBU6>
cn.close(); O)q4^AE$
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Jpapl%7v
(h0@;@@7hW
可滚动、更新的记录集 a`'>VCg
1、创建可滚动、更新的Statement ozRO:*51
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); +YvF+E
该Statement取得的ResultSet就是可滚动的 gy.UTAs
N
2、创建PreparedStatement时指定参数 LSC[S:
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); On*I.~
ResultSet.absolute(9000); ga
+,
P
批量更新 ]d1'5F][H
1、Statement "-&K!Vfs
Statement sm = cn.createStatement(); &Gt{9#
sm.addBatch(sql1); Qf~>5(,h
sm.addBatch(sql2); ]yPK}u
... rDWAZ<;;
sm.executeBatch() ogFo/TKM
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 &Sd5]r@+
2、PreparedStatement YZf{."Opj[
PreparedStatement ps = cn.preparedStatement(sql); Jw]!x1rF~
{ W:i Q&[f
ps.setXXX(1,xxx); RhowhQ) G
... \foThLx
ps.addBatch(); bN_e~ z
} )k(K/m
ps.executeBatch(); X~r9yl>
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 LA Crg
x {NBhq(4
事务的处理 PLz{EQ[cV
1、关闭Connection的自动提交 ZO%^r%~s
cn.setAutoCommit(false); }+!"mJx@
2、执行一系列sql语句 0
P YYG
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close D)-LZbPa
Statement sm ; HgY@M
sm = cn.createStatement(insert into user...); |?88EG@05
sm.executeUpdate(); Ge2Klyi
sm.close(); 0S5xmEzop
sm = cn.createStatement("insert into corp...); 1?.CXqK
sm.executeUpdate(); O<$w-(
sm.close(); d ~M;
3、提交 0T`Qoo>u
cn.commit(); 4FaO+Eo,8
4、如果发生异常,那么回滚 Z|_V ;*
cn.rollback();