java 数据库基本操作 r#+d&.|
1、java数据库操作基本流程 O}tZ - 'T
2、几个常用的重要技巧: 4zASMu
可滚动、更新的记录集 RS"H8P4W
批量更新 e>7]w,*|
事务处理 u}>#Eb
|S_T^'<W
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 2VF%@p
1、取得数据库连接 B268e
1)用DriverManager取数据库连接 FYOD
Upn
例子 ,`wXg
String className,url,uid,pwd; us;YV<)d
className = "oracle.jdbc.driver.OracleDriver"; y)F;zW<+
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; _wC3kAO
uid = "system"; ?Eg(Gu.J
pwd = "manager"; Q~814P8]
Class.forName(className); FqkDKTS\&
Connection cn = DriverManager.getConnection(url,uid,pwd); `sUZuWL_
2)用jndi(java的命名和目录服务)方式 7Ilm{@b=
例子 N/]o4o
String jndi = "jdbc/db"; ;KOLNi-B&
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); RSr
%n1
DataSource ds = (DataSource) ctx.lookup(jndi); I[=j&rK`
Connection cn = ds.getConnection(); @|Fg,N<Y]
多用于jsp中 Jpj}@,
2、执行sql语句 3 ,>0a
1)用Statement来执行sql语句 pwO>h>ik
String sql; CEXyrs<
Statement sm = cn.createStatement(); 3b*cU}go
sm.executeQuery(sql); // 执行数据查询语句(select) &Flglj~7l
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); dI*pDDq#
2)用PreparedStatement来执行sql语句 ~hZ"2$(0
String sql; d{rQzia"mV
sql = "insert into user (id,name) values (?,?)"; A3rPt&<a
PreparedStatement ps = cn.prepareStatement(sql); IN4=YrM^
ps.setInt(1,xxx); s4G|_==
ps.setString(2,xxx); A:>01ZJ5S+
... cmBB[pk\
ResultSet rs = ps.executeQuery(); // 查询 $@sEn4h
int c = ps.executeUpdate(); // 更新 bsuus
R9W
So{x]x:f
3、处理执行结果 'Hc-~l>D
查询语句,返回记录集ResultSet [r3 !\HI7x
更新语句,返回数字,表示该更新影响的记录数 - d8TD*^
ResultSet的方法 @_U;9)
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ,^?^dB
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 |s)Rxq){"V
L>MLi3{
4、释放连接 ,RE\$~`w
cn.close(); yN~dU0.G6!
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ^w(p8G_-w
s<*XNNE7
可滚动、更新的记录集 0F@"b{&0
1、创建可滚动、更新的Statement 7]^M>#
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); (>F%UY
该Statement取得的ResultSet就是可滚动的 SLO%7%>p
2、创建PreparedStatement时指定参数 ;+0t;B!V
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); lFa02p0
ResultSet.absolute(9000); z8{a(nK P
批量更新 =6woWlf b
1、Statement F4It/
Statement sm = cn.createStatement(); W^fuScG)c
sm.addBatch(sql1); F\fWvXdW
sm.addBatch(sql2); 7Ok;Lt!x
... 2}YOcnB
sm.executeBatch() aJYgzr,
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 z)'M k[
2、PreparedStatement n_$
:7J
PreparedStatement ps = cn.preparedStatement(sql); el2bd
:
{ dOqOw M.y
ps.setXXX(1,xxx); Fp@TCPe#
... 6^uq?
ps.addBatch(); T^:UBjK6t{
} NZ;{t\
ps.executeBatch(); ="x\`+U
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ^m?KRm2
P9=?zh6G.
事务的处理 W)9K`hM6
1、关闭Connection的自动提交 MG[o%I96
cn.setAutoCommit(false); &Ts-a$Z7?S
2、执行一系列sql语句 O_$m!5ug
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close zV:pQRbt.
Statement sm ; &$"i,~q^b
sm = cn.createStatement(insert into user...); Is]aj-#r
sm.executeUpdate(); ]GN7+8l
sm.close(); sW)Zi
sm = cn.createStatement("insert into corp...); ld3-C55
sm.executeUpdate(); ~(x;5{
sm.close(); T;@;R%
3、提交 ,$1eFgY%
cn.commit(); WtViW=j'
4、如果发生异常,那么回滚 RMd[Yr2e
cn.rollback();