java 数据库基本操作 ?4?jG3p
1、java数据库操作基本流程 E4@fP]R+
2、几个常用的重要技巧: >!p K94
可滚动、更新的记录集 &!~n=]*sz
批量更新 `.-k%2?/
事务处理 [hj'Yg 8{
OQ*. ho
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 s(9rBDoY(8
1、取得数据库连接 y#0Z[[I0
1)用DriverManager取数据库连接 ~u&O
例子 m9 5$V&
String className,url,uid,pwd; Q&'Nr3H#tZ
className = "oracle.jdbc.driver.OracleDriver"; qtwmTT)
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; _~q^YZ
uid = "system"; \$|UFx
pwd = "manager"; ~:b~f]lO
Class.forName(className); nt`l6b
Connection cn = DriverManager.getConnection(url,uid,pwd); RSeezP6#
2)用jndi(java的命名和目录服务)方式 H 6<@
例子 5j01Mx
A
String jndi = "jdbc/db"; |MrH@v7S
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Ntrn("!
DataSource ds = (DataSource) ctx.lookup(jndi); kx(:Z8DX
Connection cn = ds.getConnection(); Sf:lN4
多用于jsp中 b!P;xLcb
2、执行sql语句 J+|V[E<x
1)用Statement来执行sql语句 -dN;\x
String sql; eh(]'%![/
Statement sm = cn.createStatement(); _[tBLGXD
sm.executeQuery(sql); // 执行数据查询语句(select) _ILOA]ga#
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); SO<K#HfE$?
2)用PreparedStatement来执行sql语句 Lcb59Cs6e
String sql; L6#d
sql = "insert into user (id,name) values (?,?)"; UVU*5U~
PreparedStatement ps = cn.prepareStatement(sql); vt=S0X^$yc
ps.setInt(1,xxx); DNO%J^
ps.setString(2,xxx); ebVfny$D
... *Yjs$'_2
ResultSet rs = ps.executeQuery(); // 查询 [B<{3*R_
int c = ps.executeUpdate(); // 更新 ]F-6KeBc
9'aR-tFun;
3、处理执行结果 }}2hI`
查询语句,返回记录集ResultSet \$UU/\
更新语句,返回数字,表示该更新影响的记录数 Z|wDM^Lf
ResultSet的方法 IT33E%G
1、next(),将游标往后移动一行,如果成功返回true;否则返回false NU*6iLIq|F
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ]g!<5w
V1qHl5"
4、释放连接 <v^.FxId
cn.close(); -e\kIK
%
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ~WLsqP5Y~a
U]3JCZ{]0E
可滚动、更新的记录集 Bv*h?`Q
1、创建可滚动、更新的Statement \hc9Rk
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Wm_-T]#_
该Statement取得的ResultSet就是可滚动的 ^O"`.2O1
2、创建PreparedStatement时指定参数 `Yve
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 4D$E
ResultSet.absolute(9000); Q+N @j]'
批量更新 <(%uOo$
1、Statement :9qB{rLi}
Statement sm = cn.createStatement(); v1rGq
sm.addBatch(sql1); }N!8i'suz9
sm.addBatch(sql2); @L7rE)AU.
... h {btT
sm.executeBatch() j. cH,Y
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 f& *E;l0
2、PreparedStatement r?7^@
PreparedStatement ps = cn.preparedStatement(sql); O-Y E6u
{ @#">~P|Hp
ps.setXXX(1,xxx); XA%?35v~
... !4fL|0
ps.addBatch(); YJ`>&AJ
} |Dli6KN
ps.executeBatch(); LYv2ll`XP
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 kXRD_B5&
*i90[3l
事务的处理 JH9CN
1、关闭Connection的自动提交 )63w&
cn.setAutoCommit(false); m0YDO0
2、执行一系列sql语句 sS|5x
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close $^F2
Statement sm ; y.OUn'^d4
sm = cn.createStatement(insert into user...); }=5(*Vg
sm.executeUpdate(); !).dc.P
sm.close(); 5j%jhby?
sm = cn.createStatement("insert into corp...); E2cmT$6
sm.executeUpdate(); I.x>mN-0
sm.close(); <jjaqDSmz
3、提交 K;O\Pd
cn.commit(); ps[rYy
4、如果发生异常,那么回滚 @m4d 4K@
cn.rollback();