java 数据库基本操作 <4LJ#Fx
1、java数据库操作基本流程 >lV,K1Z
2、几个常用的重要技巧: T4]2R
可滚动、更新的记录集 gMI%!Y
批量更新 vSR&>Q%X
事务处理 86OrJdD8
M!'d
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 yuZLsH
1、取得数据库连接 e&;e<6l&{
1)用DriverManager取数据库连接 7.<jdp
例子 ot<d
FvD
String className,url,uid,pwd; ksC_F8Q+
className = "oracle.jdbc.driver.OracleDriver"; UE'=9{o`
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; A,.X
uid = "system"; 3W7^,ir
pwd = "manager"; Nu6NyYs
Class.forName(className); Cq!eAc
Connection cn = DriverManager.getConnection(url,uid,pwd); QT,T5Q%JP:
2)用jndi(java的命名和目录服务)方式 zbxW
U]<S?
例子 LG&BWs!
String jndi = "jdbc/db"; ;stuTj@vH
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); +a!3*G@N+
DataSource ds = (DataSource) ctx.lookup(jndi); 'IX1WS&\"
Connection cn = ds.getConnection(); euB 1}M
多用于jsp中 N1ipK9a
2、执行sql语句 Rlewp8?LB
1)用Statement来执行sql语句 K5qCPt`'
String sql; A0Mjk
Statement sm = cn.createStatement(); &YXJ{<s
sm.executeQuery(sql); // 执行数据查询语句(select) ^xa, r#N:V
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ?$6H',u
2)用PreparedStatement来执行sql语句 P+j=]Yg
String sql; \EfX3ghPI
sql = "insert into user (id,name) values (?,?)"; ELCNf
PreparedStatement ps = cn.prepareStatement(sql); *DPX4P
ps.setInt(1,xxx); |Mq+QDTTw~
ps.setString(2,xxx); rRq60A
... eB5>uKa
ResultSet rs = ps.executeQuery(); // 查询 ,s~l; Gkj
int c = ps.executeUpdate(); // 更新 5*%Gh&)
m;dwt1'Zw
3、处理执行结果 UTkPA2x
查询语句,返回记录集ResultSet AT"gRCU$4
更新语句,返回数字,表示该更新影响的记录数 ({!!b"B2
ResultSet的方法 uxf,95<g)
1、next(),将游标往后移动一行,如果成功返回true;否则返回false f)*"X[)o
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 /]`@.mZ9:
TwkT|Piw
S
4、释放连接 >38>R0k35
cn.close(); #3rS{4[
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection [KK
|_
RM|J |R
可滚动、更新的记录集 y&$n[j
1、创建可滚动、更新的Statement Cb ;6yE)!Z
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); )s
$]+HQs
该Statement取得的ResultSet就是可滚动的 0zr27ko
2、创建PreparedStatement时指定参数 ^~H}N$W"-q
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); a4,V(Hlm
ResultSet.absolute(9000); E'LI0fr
批量更新 /L^g. ~
1、Statement *E/Bfp1LIe
Statement sm = cn.createStatement(); stRM*.
sm.addBatch(sql1); rt+4-WuK>
sm.addBatch(sql2); ;_cTrjMv\
... ETHcZ
sm.executeBatch() Ixxs(
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 TWRP|i!i
2、PreparedStatement G)7U&B
PreparedStatement ps = cn.preparedStatement(sql); H~j@n!)
{ :'p)xw4K|
ps.setXXX(1,xxx); (]#^q8)]\9
... 3:WqUb\QK
ps.addBatch(); h[remR#3\
} xk,Uf,,>
ps.executeBatch(); ZsP ^<
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 layxtECP(
c]9gf\WW
事务的处理 O=o}uB-*6
1、关闭Connection的自动提交 =7Ud-5c
cn.setAutoCommit(false); 0>|q[SC
2、执行一系列sql语句 $nE{%?n-#
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close {lds?AuK
Statement sm ;
p'h'Cz
sm = cn.createStatement(insert into user...); JQM_96\
sm.executeUpdate(); \ja6g
sm.close(); 5eTA]
sm = cn.createStatement("insert into corp...); x/s:/YN'
sm.executeUpdate(); oZ%uq78#[%
sm.close(); ^OV; P[
3、提交 07.p
{X R
cn.commit(); |xB`cSu(
4、如果发生异常,那么回滚 ?IGp?R^j"
cn.rollback();