java 数据库基本操作 XNMa0
1、java数据库操作基本流程 :HxA`@Ok
2、几个常用的重要技巧: 4n1; Bh$
可滚动、更新的记录集 %owsBO+
批量更新 9~rUkHD
事务处理 Z|9u]xL
'\fY<Q:!
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 p Rdk>Ph
1、取得数据库连接 7?gFy-
1)用DriverManager取数据库连接 3cS2gxF
例子 {j {+0V
String className,url,uid,pwd; )? M9|u
className = "oracle.jdbc.driver.OracleDriver"; d%I"/8-J
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; l+][V'zL
uid = "system"; m@`8A
pwd = "manager"; [ao
U5;7
Class.forName(className); O|A_PyW
Connection cn = DriverManager.getConnection(url,uid,pwd); ; R=.iOn
2)用jndi(java的命名和目录服务)方式 BG^C9*ZuP
例子 R.[Z]-X
String jndi = "jdbc/db"; _{vkX<s
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); UX<Qcjm$e
DataSource ds = (DataSource) ctx.lookup(jndi); +bK.NcS
Connection cn = ds.getConnection(); ^ 5VK>
多用于jsp中 GhY1k";
2、执行sql语句 kL7#W9
1)用Statement来执行sql语句 dUgrKDNyA
String sql; Uq_j\A;c
Statement sm = cn.createStatement(); '/Bidb?
sm.executeQuery(sql); // 执行数据查询语句(select) UmnE@H"t$\
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); !{n<K:x1
2)用PreparedStatement来执行sql语句 -"Y{$/B
String sql; D9mz9
sql = "insert into user (id,name) values (?,?)"; 2-zT$`[]J
PreparedStatement ps = cn.prepareStatement(sql); V]c;^
ps.setInt(1,xxx); Ee1LO#^_6
ps.setString(2,xxx); ^[Ua46/" m
... )yY6rI;:
ResultSet rs = ps.executeQuery(); // 查询 b5IA"w
int c = ps.executeUpdate(); // 更新 =&0wr6
Bx"7%[
3、处理执行结果 t#nn@Yf
查询语句,返回记录集ResultSet 1Kvx1p
更新语句,返回数字,表示该更新影响的记录数 2>-S-;i
ResultSet的方法 kpbm4t
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Z34Wbun4
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 P+t#4J
V>64/
4、释放连接 ]%uZ\Q;9p
cn.close(); :0K8h
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection E|YdcS
]Mj/&b>"e
可滚动、更新的记录集 Sp}D;7
1、创建可滚动、更新的Statement bi ozZ
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ]J9cVp
该Statement取得的ResultSet就是可滚动的 133I.XBU
2、创建PreparedStatement时指定参数
B .TB\j
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); &bgvy'p
ResultSet.absolute(9000); 5!C_X5M
批量更新 B,z<%DAE
1、Statement obK*rdg,
Statement sm = cn.createStatement(); 9p 4"r^
sm.addBatch(sql1); }
B396X
sm.addBatch(sql2); '^%~JyU
... )CI1;
sm.executeBatch() wOQ#N++C
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 <?D[9Mk$
2、PreparedStatement IfO;S*Qt
PreparedStatement ps = cn.preparedStatement(sql); *F>v]8
{ vN4Qdpdb
ps.setXXX(1,xxx); = 5D nR
... PqNFyQkl
ps.addBatch(); <)g8yA
} <J(sR
ps.executeBatch(); h0?2j)X_
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 jNwjK0?
/$n ~lf
事务的处理 c[}(OH
1、关闭Connection的自动提交 C
]Si|D
cn.setAutoCommit(false); 6m .k;'
2、执行一系列sql语句 ~,D@8tv
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close p3ISWJa!
Statement sm ; `"i Y*
sm = cn.createStatement(insert into user...); Q@e[5RA+]
sm.executeUpdate(); Mcw4!{l`
sm.close(); n[Zz]IO,g
sm = cn.createStatement("insert into corp...); , "jbq~
sm.executeUpdate(); pqvOJ#?Q}=
sm.close(); gIR^)m
3、提交 r
_,_5
@0e
cn.commit(); MyJ4><oG
4、如果发生异常,那么回滚 z|G9,:9
cn.rollback();