java 数据库基本操作 j#-ZL-N
1、java数据库操作基本流程 N+HN~'8r
2、几个常用的重要技巧: <^n9?[m*
可滚动、更新的记录集 \&@Tq-o
批量更新 #^!oP$>1
事务处理 RX?Nv4-
*|_u~v:)|5
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 9e=F
1、取得数据库连接 fJc,KZy
1)用DriverManager取数据库连接 Gp;[WY\
例子 ;`X -.45
String className,url,uid,pwd; kl3#&>e
className = "oracle.jdbc.driver.OracleDriver"; dE/Vl/ :
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; kj@#oLd%
uid = "system"; Qs#v/r
pwd = "manager"; ^a<=@0|
Class.forName(className); '(^p$=3|@D
Connection cn = DriverManager.getConnection(url,uid,pwd); #mx;t3ja7
2)用jndi(java的命名和目录服务)方式 ;[gv-H
例子 +Nc|cj
String jndi = "jdbc/db"; (;~[}"
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); s8@f Z4
DataSource ds = (DataSource) ctx.lookup(jndi); MZv&$KG4m@
Connection cn = ds.getConnection(); t8]u#bx"?
多用于jsp中 iu*u|e
2、执行sql语句 h-lMrI)U?h
1)用Statement来执行sql语句 +;FF0_
String sql; "Q2[A]4E
Statement sm = cn.createStatement(); h^x7[qe
sm.executeQuery(sql); // 执行数据查询语句(select) <adu^5BI
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); .?!{. D
2)用PreparedStatement来执行sql语句 0<!kGL5
String sql; 99:`58G
sql = "insert into user (id,name) values (?,?)"; -uy}]s5Qu
PreparedStatement ps = cn.prepareStatement(sql); yq6!8OkF
ps.setInt(1,xxx); F[RhuNa&'W
ps.setString(2,xxx); lSXhHy
... }! zjj\g^
ResultSet rs = ps.executeQuery(); // 查询 XRP/E_4
int c = ps.executeUpdate(); // 更新 d@,q6R}!MP
0e:K iUr
3、处理执行结果 I?bL4u$\
查询语句,返回记录集ResultSet %b@>riR(y
更新语句,返回数字,表示该更新影响的记录数 LO#{
ResultSet的方法 rLh490@
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ,_\h)R_
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 <0v'IHlZ8
.N/4+[2p(
4、释放连接 u+8_et5T
cn.close(); R;I}#b cJ
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection >tib21*
!l.Rv_o<O
可滚动、更新的记录集 sE>'~+1_O
1、创建可滚动、更新的Statement z_A%>E4
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); WYEvW<Hv
该Statement取得的ResultSet就是可滚动的 8'`&f&
2、创建PreparedStatement时指定参数 Vk0O^o
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); cf0em!
ResultSet.absolute(9000); O!Mm~@MoA
批量更新 Oo rH
1、Statement z)QyQ
Statement sm = cn.createStatement(); )TRDM[u
sm.addBatch(sql1); E%H,Hk^
sm.addBatch(sql2); e<iTU?eJM
... q.Z0Q
sm.executeBatch() "=4=Q\0PT
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 w$61+KH K
2、PreparedStatement 0vQkm<
PreparedStatement ps = cn.preparedStatement(sql); "]zq<LmX
{ @OwU[\6fc}
ps.setXXX(1,xxx); ,!sAr;Rk`
... 2HQHC]
ps.addBatch(); .!)7x3|$[
} BN#^
/a-
ps.executeBatch(); 6"&&s
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 d{ OY
->8n.!F}
事务的处理 nqiy)ZN#R
1、关闭Connection的自动提交 g\ <Lb
cn.setAutoCommit(false); ^9cqT2:t
2、执行一系列sql语句 {Z-5
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close
JhB{aW>
Statement sm ; Fo~C,@/Qt
sm = cn.createStatement(insert into user...); q' _
sm.executeUpdate(); :V+t|@m5l
sm.close(); `pII-dSC%
sm = cn.createStatement("insert into corp...); Kq-y1h]7H
sm.executeUpdate(); AbcLHV.
sm.close(); B<:i[~`7t
3、提交 b!7"drge:
cn.commit(); $5il]D`
4、如果发生异常,那么回滚 }"q1B
cn.rollback();