java 数据库基本操作
{ 8 K
1、java数据库操作基本流程 q,ie)`
2、几个常用的重要技巧: <2]h$53y!
可滚动、更新的记录集 u;9iuc`*
批量更新 fh`Y2s|:7R
事务处理 Mk#r_:[BS
Mi.2
>
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 "}_J"%
1、取得数据库连接
= "]r{
1)用DriverManager取数据库连接 1L::Qu%E
例子 :.AC%'S
String className,url,uid,pwd; 3Y#
className = "oracle.jdbc.driver.OracleDriver"; WILa8"M
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; f.J^HQ_
uid = "system"; |I1,9ex
pwd = "manager"; !X7z y9
Class.forName(className); O83J[YuzjN
Connection cn = DriverManager.getConnection(url,uid,pwd); O;4S<N
2)用jndi(java的命名和目录服务)方式 R^`}DlHX
例子 #"6l+}
String jndi = "jdbc/db"; :i>LESJq
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Ru`afjc
DataSource ds = (DataSource) ctx.lookup(jndi); 5*2hTM!
Connection cn = ds.getConnection(); &]a(5
多用于jsp中 8US35t:M
2、执行sql语句 Gs"lmX-{$j
1)用Statement来执行sql语句 FMCA~N
String sql; W2XWb<QSEV
Statement sm = cn.createStatement(); :a Cf@:']
sm.executeQuery(sql); // 执行数据查询语句(select) yI8O#
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); TkTGYh
2)用PreparedStatement来执行sql语句 eHUyV@
String sql; {s@!N
sql = "insert into user (id,name) values (?,?)"; Ydsnu
PreparedStatement ps = cn.prepareStatement(sql); Q#yHH]U)X
ps.setInt(1,xxx); 1^o})9
ps.setString(2,xxx); 2n>mISy+
... }2LG9B%
ResultSet rs = ps.executeQuery(); // 查询 fV4eGIR&
int c = ps.executeUpdate(); // 更新 vULDKJNHX
xKL(:ePS
3、处理执行结果 C4E}.``Hm
查询语句,返回记录集ResultSet aT2%Az@j
更新语句,返回数字,表示该更新影响的记录数 <P1nfH
ResultSet的方法 R5b,/>^'A
1、next(),将游标往后移动一行,如果成功返回true;否则返回false pqs!kSJV
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 0UpRSh)#
+>1Yp"> ?
4、释放连接 %62|dhl6
cn.close(); ([$KXfAi]h
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection A?HDY_u
ksU& q%1
可滚动、更新的记录集 EIzTbW{p
1、创建可滚动、更新的Statement R|Bi%q|4P
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); t@lTA>;U@
该Statement取得的ResultSet就是可滚动的 "
AvEo
2、创建PreparedStatement时指定参数 '`}D+IQ(j
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); sifjmNP
ResultSet.absolute(9000); M GC=L .
批量更新 )]Zdaw)X
1、Statement w@WtW8
p^
Statement sm = cn.createStatement(); w`boQ_Ir
sm.addBatch(sql1); *9KT@"v
sm.addBatch(sql2); te;bn4~
... -GL.8"c[
sm.executeBatch() i|H^&$|
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 vKoQ!7g
2、PreparedStatement 1|
WDbk
PreparedStatement ps = cn.preparedStatement(sql); q\P{h ij
{ uuHs)
ps.setXXX(1,xxx); 4%v-)HGh
... Yc[vH=gV}
ps.addBatch(); NB3+kf ,
} ?aaYka]
ps.executeBatch(); q=cnY+p>
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 qzY:>>d'
R90chl
事务的处理
fCb&$oRr!
1、关闭Connection的自动提交 y\6C9%.
cn.setAutoCommit(false); :`yW^b
2、执行一系列sql语句 Xa}y.qH
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close FzsW^u+
Statement sm ; bneP>Bd
sm = cn.createStatement(insert into user...); $\oe}`#o
sm.executeUpdate(); F9_X^#%L
sm.close(); S2I{?y&K
sm = cn.createStatement("insert into corp...); hNcEBSQ
sm.executeUpdate(); JDpW7OrDc
sm.close(); B&3@b
3、提交 !9zs>T&9a\
cn.commit(); $f"Ce,f
4、如果发生异常,那么回滚 ^7kYG7/
cn.rollback();