java 数据库基本操作 FzJ7 OE|
1、java数据库操作基本流程 :dSda,!z
2、几个常用的重要技巧: @vt.Db
可滚动、更新的记录集 E&P2E3P
批量更新 Cf2WBX$
事务处理 pUXoSnIq:
-^xbd_'
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 gA!@oiq@
1、取得数据库连接 !#c'|
*k
1)用DriverManager取数据库连接 At iUTA
例子 RRIh;HhX
String className,url,uid,pwd; @KQ.t F*
className = "oracle.jdbc.driver.OracleDriver"; $eYL|?P50h
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ;miif
uid = "system"; &J>e;X
pwd = "manager"; f"ndLX:'}
Class.forName(className); $a M5jH<
Connection cn = DriverManager.getConnection(url,uid,pwd); \VNu35* J|
2)用jndi(java的命名和目录服务)方式 Ktq 4b%{
例子 M^o_='\bE
String jndi = "jdbc/db"; _=GjJ~2n
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 51jgx,-|$
DataSource ds = (DataSource) ctx.lookup(jndi); @NL cO}
Connection cn = ds.getConnection(); QqA=QTZ}
多用于jsp中 ("9bV8:@B
2、执行sql语句 cFUD$mp
1)用Statement来执行sql语句 ngo> ^9/8
String sql; D.K""*ula
Statement sm = cn.createStatement(); EwC]%BZP
sm.executeQuery(sql); // 执行数据查询语句(select) g#J`7n
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); _K^Q]V[nZ
2)用PreparedStatement来执行sql语句 4&}%GH>}
String sql; ZL(
j5E
sql = "insert into user (id,name) values (?,?)"; ]r
Uj<[O
PreparedStatement ps = cn.prepareStatement(sql); n
i#jAwkN5
ps.setInt(1,xxx); p
F-Lz<V
ps.setString(2,xxx); xXe3E&
... \P<aK$g
ResultSet rs = ps.executeQuery(); // 查询 `6Bx8CZ'I
int c = ps.executeUpdate(); // 更新 2q~.,vpP
u<-)C)z
3、处理执行结果 |P
>"a`
查询语句,返回记录集ResultSet lsz3'!%Y)
更新语句,返回数字,表示该更新影响的记录数 gHg=G+Q@
ResultSet的方法 1'~Xn
4
f
1、next(),将游标往后移动一行,如果成功返回true;否则返回false #Rw!a#CX.
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 aAg Qv*
U,Z\)+-R
4、释放连接 7%*#M#(T
cn.close(); (95|DCL
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection W$4$%r8
Q:-T'xk@
可滚动、更新的记录集 O^L]2BVC
1、创建可滚动、更新的Statement X3sAy(q
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); !SuflGx,q
该Statement取得的ResultSet就是可滚动的 %ddH4Q/p
2、创建PreparedStatement时指定参数 e6p3!)@P1
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); (rFkXK4^J
ResultSet.absolute(9000); k
-G9'c~
批量更新 4}C
\N
1、Statement
3?D,
Wu
Statement sm = cn.createStatement(); D2VYw<tEA
sm.addBatch(sql1); +mjwX?yF
sm.addBatch(sql2); 3>n&u,Xe
... rn
.qs
sm.executeBatch() 0j8fU7~6S
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 qG,h
1
2、PreparedStatement E^J &?-
PreparedStatement ps = cn.preparedStatement(sql); u>;aQtK~
{ xDeM7L'
ps.setXXX(1,xxx); @(L}:]{@
... zwUC
L
ps.addBatch(); od#Lad@p
} t,LK92?
ps.executeBatch(); }t#|+T2f
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 <e#v9=}DI
-W6@[5 c
事务的处理 iZk4KX
1、关闭Connection的自动提交 {
1~]}K2
cn.setAutoCommit(false); Ak3^en
2、执行一系列sql语句 I]n X6=j5
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close l\0PwD
Statement sm ; n3?P8m$
sm = cn.createStatement(insert into user...); i-w<5pGnf
sm.executeUpdate(); ^XeJZkLEB
sm.close(); ^jL44?W}l
sm = cn.createStatement("insert into corp...); ax5n}
sm.executeUpdate(); r;b `@
.
sm.close(); <VU-ja*(J
3、提交 <zY#qFQ2
cn.commit(); c61 1&
4、如果发生异常,那么回滚 c|:EMYS
cn.rollback();