java 数据库基本操作 kO\aNtK
1、java数据库操作基本流程 ZA4vQDW
2、几个常用的重要技巧: aTY\mKk
可滚动、更新的记录集 M>g\Y
批量更新 t7DT5SrR
事务处理 V`"A|Y
3+jqf@ fO
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 9a9{OJa6M
1、取得数据库连接 UYb:q
1)用DriverManager取数据库连接 y|%rW
例子 h|1 /Q
(
String className,url,uid,pwd; JuT~~Z
className = "oracle.jdbc.driver.OracleDriver"; :AB$d~${M>
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; n P4DHb&5
uid = "system"; .qBf`T;
pwd = "manager"; ',p`B-dw
Class.forName(className); 5zF7yvS.w
Connection cn = DriverManager.getConnection(url,uid,pwd); vJfex,#lv
2)用jndi(java的命名和目录服务)方式 t1YVE%`w
例子 /g!', r,
String jndi = "jdbc/db"; 'e>0*hF[
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ]T! >]
DataSource ds = (DataSource) ctx.lookup(jndi); }A`4ae=
Connection cn = ds.getConnection(); M1T)e9k=x
多用于jsp中 3 tp'}v
2、执行sql语句 B@Q Ate7
1)用Statement来执行sql语句 4`7:gfrO,
String sql; h~
=UFE%'
Statement sm = cn.createStatement(); ]MP6VT
sm.executeQuery(sql); // 执行数据查询语句(select) @ zE>n
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); x;Jy-hMNl
2)用PreparedStatement来执行sql语句 xV4
#_1(
String sql; dw!cDfT+
sql = "insert into user (id,name) values (?,?)"; _0<EbJ8Z
PreparedStatement ps = cn.prepareStatement(sql); /K9Tn
ps.setInt(1,xxx); LMrb
1lg$
ps.setString(2,xxx); X)|b_ 3Z
...
um[nz
ResultSet rs = ps.executeQuery(); // 查询 aD@sb o
int c = ps.executeUpdate(); // 更新 n15F4DnP
PSQ5/l?\>
3、处理执行结果 k/yoRv%
查询语句,返回记录集ResultSet /t083
更新语句,返回数字,表示该更新影响的记录数 y-93 >Y
ResultSet的方法 n
LZ
1、next(),将游标往后移动一行,如果成功返回true;否则返回false l(@UpV-
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 G~I@'[ur
Q!:J.J
4、释放连接 iC`K$LY4W
cn.close(); !e>EDYbY
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection N (W;(7
[s4lSGh
可滚动、更新的记录集 w"O^CR)
1、创建可滚动、更新的Statement V\"x#uB
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); m]$!wp
该Statement取得的ResultSet就是可滚动的 T^ ^o
2、创建PreparedStatement时指定参数 ~g+?]Lk}
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); wYJ. F
ResultSet.absolute(9000); dhW)<
批量更新 h`OX()N
1、Statement dw8Ce8W
Statement sm = cn.createStatement(); uFIr.U$V
sm.addBatch(sql1); gD0 FRKn
sm.addBatch(sql2); x-km)2x=W
... ;aip1Df
sm.executeBatch() kckWBL
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ~
FW@
2、PreparedStatement ?1Lzbou
PreparedStatement ps = cn.preparedStatement(sql); 1O0o18'
{ r(IQ)\GR
ps.setXXX(1,xxx); f YR*B0tu
... t%wC~1
ps.addBatch(); vJT
%ET
} G-[fz
ps.executeBatch(); Lmx95[#@a
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 _
a|zvH
W|o LS
事务的处理 R g7 O
1、关闭Connection的自动提交 {i)k# `
cn.setAutoCommit(false); t8,s]I&
2、执行一系列sql语句 ~*9
vn Z@
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close v_PhJKE
Statement sm ; o })k@-oL
sm = cn.createStatement(insert into user...); {1.t ZCMT
sm.executeUpdate(); iw <2|]>l
sm.close(); PK@hf[YHe
sm = cn.createStatement("insert into corp...); B(x i
sm.executeUpdate(); ^<#08L;
sm.close(); G%w hOIFRq
3、提交 4~8++b1/;
cn.commit(); .V9/0
4、如果发生异常,那么回滚 j()<.h;'
cn.rollback();