java 数据库基本操作 q5S_B]|
1、java数据库操作基本流程 Nd"IW${Kg
2、几个常用的重要技巧: b{,v?7^4
可滚动、更新的记录集 v&(=^A\eN
批量更新 \.oJ/++
事务处理 ]cv|dc=
7]{t^*
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Q\}-MiI/
1、取得数据库连接 ?%su?L
1)用DriverManager取数据库连接 IY8<^Q']
例子 :!Dm,PP%
String className,url,uid,pwd; yGNpx3H
className = "oracle.jdbc.driver.OracleDriver"; Y>/_A%vQU
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 3uxf n=E
uid = "system"; ?>{u@tYL
pwd = "manager"; u=qaz7E
Class.forName(className); 4eB oR%2o
Connection cn = DriverManager.getConnection(url,uid,pwd); ybsw{[X>M
2)用jndi(java的命名和目录服务)方式 )eT>[['fm
例子 j0X^,ot@m
String jndi = "jdbc/db"; !W8=\:D[
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ~]RfOpq^w
DataSource ds = (DataSource) ctx.lookup(jndi); wu
eDedz\
Connection cn = ds.getConnection(); sbX7VfAR`
多用于jsp中 K> 4w
2、执行sql语句 G1w$lc
1)用Statement来执行sql语句 xM!9$v
String sql; Vt3*~Beb
Statement sm = cn.createStatement(); nyqX\m-
sm.executeQuery(sql); // 执行数据查询语句(select) %qo.n v
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); -C(Yl=
2)用PreparedStatement来执行sql语句 2Sa{=x
N)
String sql; spm)X-[1
sql = "insert into user (id,name) values (?,?)"; g(X`.0
PreparedStatement ps = cn.prepareStatement(sql); 4H,c;g=!
ps.setInt(1,xxx); &+@`Si=
ps.setString(2,xxx); r5UVBV8T
... sRZ<c
ResultSet rs = ps.executeQuery(); // 查询 !ry+{v+A
int c = ps.executeUpdate(); // 更新 axt;}8
fap]`P~#L
3、处理执行结果 "OYD9Q''
查询语句,返回记录集ResultSet =O"]e/CfO
更新语句,返回数字,表示该更新影响的记录数 #_S]\=N(
ResultSet的方法 8@LWg d
1、next(),将游标往后移动一行,如果成功返回true;否则返回false [pp|*@1T
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 4v_Hh<%
1hCU"|VH:
4、释放连接 P2f^]z
cn.close(); )sdHJ
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection .TdFI"Yn
CUG"2K9
可滚动、更新的记录集 @$^4Av-
1、创建可滚动、更新的Statement F.aG7
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); -N^Ah_9ek
该Statement取得的ResultSet就是可滚动的 kiN,N]-V
2、创建PreparedStatement时指定参数 5NN;Fw+
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); PDw+Q
ResultSet.absolute(9000); l#T%N@X
批量更新 s#aj5_G
1、Statement )V>OND
Statement sm = cn.createStatement(); ZAy/u@qt
sm.addBatch(sql1); j2IK\~W?-
sm.addBatch(sql2); M[z1B!rT
... }T\.;$f
sm.executeBatch() yv]|Ce@8A
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 w.J$(o(/
2、PreparedStatement e~(e&4pb
PreparedStatement ps = cn.preparedStatement(sql); Rzsu 7w
{ RV{%@1Pu
ps.setXXX(1,xxx); y0T#Qq
... U _A'/p^D
ps.addBatch(); /%,aX[
} B@ufrQ#Y.
ps.executeBatch(); tKe-Dk9
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 CYE[$*g6y
V[*>}XQER
事务的处理 ~/JS_>e#6P
1、关闭Connection的自动提交 .5s58Hcg,
cn.setAutoCommit(false); oxeu%wj_
2、执行一系列sql语句 { ?jXPf
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close /({oN1X>i
Statement sm ; KGc.YUoE
sm = cn.createStatement(insert into user...); J!~kqNI
sm.executeUpdate(); F7b%
x7b
sm.close(); $,/E"G`
sm = cn.createStatement("insert into corp...); PknKzrEG:>
sm.executeUpdate(); O wu?ND
sm.close(); m='}t \=
3、提交 3J
5,V
cn.commit(); fDW:|%{Y,
4、如果发生异常,那么回滚
Pvt!G
cn.rollback();