java 数据库基本操作 _umO)]Si
1、java数据库操作基本流程 Sgjr4axu
2、几个常用的重要技巧: oKMg7 3*
可滚动、更新的记录集 |-cALQ
批量更新 b&|YQW}~
事务处理 hc@;}a\Y
>$k4@eg!
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 6`$,-(J=
1、取得数据库连接 0qaG#&!
1)用DriverManager取数据库连接 `#IT24!
例子 2Wc;hJ.1
String className,url,uid,pwd; 0X S' v,|
className = "oracle.jdbc.driver.OracleDriver"; &CPe$'FYI
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Og%zf1)aZM
uid = "system"; eAenkUBz6,
pwd = "manager"; q) zu}m
Class.forName(className); 45!`g+)
Connection cn = DriverManager.getConnection(url,uid,pwd); ];wohW%
2)用jndi(java的命名和目录服务)方式 1W6n[Xg
例子 sDh6 Uk
String jndi = "jdbc/db"; a3E*%G
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); J&]
XLr.j
DataSource ds = (DataSource) ctx.lookup(jndi); ['9OGV\
Connection cn = ds.getConnection(); iz,q8}/(
多用于jsp中 c_DB^M!h
2、执行sql语句 -*]9Ma<wa
1)用Statement来执行sql语句 [{.\UkV@
String sql; SqT"/e]b'
Statement sm = cn.createStatement(); @Tj
6!v
sm.executeQuery(sql); // 执行数据查询语句(select) *{4{<O<4
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); QdG?"Bdt2
2)用PreparedStatement来执行sql语句 >P]I&S-.
String sql; H$($l<G9C
sql = "insert into user (id,name) values (?,?)"; ={&TeMMA
PreparedStatement ps = cn.prepareStatement(sql); `[W)6OUCx}
ps.setInt(1,xxx); U:5*i
ps.setString(2,xxx); !&`7
... |[n|=ORI'
ResultSet rs = ps.executeQuery(); // 查询 ="[+6X
int c = ps.executeUpdate(); // 更新 BYA=M*f
;R-
z3C
3、处理执行结果 A~~|X
查询语句,返回记录集ResultSet fxf
GJNR
更新语句,返回数字,表示该更新影响的记录数 HDfQ9__
ResultSet的方法 "> 4[+'
1、next(),将游标往后移动一行,如果成功返回true;否则返回false G){1`gAhNJ
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 zqE8PbU0M;
h.+,*9T\
4、释放连接 %y^Kw
cn.close(); })=c:h&
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection s-YV_
Lu$:,^ C
可滚动、更新的记录集 {t IoC;Y
1、创建可滚动、更新的Statement n6-!@RYr
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 9#=IrlV4
该Statement取得的ResultSet就是可滚动的 5x L,~"
2、创建PreparedStatement时指定参数 @+Anv~B.
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); W3{5Do.h
ResultSet.absolute(9000); oR%E_g?mI~
批量更新 )F9%^a(
1、Statement mrBhvp""
Statement sm = cn.createStatement(); [4(A458H
sm.addBatch(sql1); _ER
cmP
sm.addBatch(sql2); 0aq-drl5\
... `S!uj <-
sm.executeBatch() OG<]`!"
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ysP/@;jC
2、PreparedStatement }X.8.S'
PreparedStatement ps = cn.preparedStatement(sql); 3kzG L
{ l#(g&x6J
ps.setXXX(1,xxx); ~'YSVx& )
... I7-PF?
ps.addBatch(); w `9GygS
} t6U+a\-<
ps.executeBatch(); 98%a)s)(a
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Q,LWZw~"
'&L
事务的处理 [>QsMUvak
1、关闭Connection的自动提交 cF>;f(X
cn.setAutoCommit(false); &G5I0:a
2、执行一系列sql语句 [}g5Z=l
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close .dq.F#2B;
Statement sm ; X]qp~:4G
sm = cn.createStatement(insert into user...); <P)%Ms
sm.executeUpdate(); LAjw!QB
sm.close(); mjJlXA
sm = cn.createStatement("insert into corp...); WlJRKM2
sm.executeUpdate(); <zWQ[^
sm.close(); ="PywZ
3、提交 Lm2cW$s
cn.commit(); 3n"&$q6
4、如果发生异常,那么回滚 j1C0LP8
cn.rollback();