java 数据库基本操作 dIk'pA^d
1、java数据库操作基本流程 YZ+>\ x
2、几个常用的重要技巧: v
dU%R\
可滚动、更新的记录集 8lwFAiC8
批量更新 h3kaD
事务处理 q +R*Hi
9RQU?
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Gzw@w{JBL
1、取得数据库连接 # :#M{1I
1)用DriverManager取数据库连接 }f#_4ACaD
例子 FEF"\O|Q
String className,url,uid,pwd; i^*M^P3m
className = "oracle.jdbc.driver.OracleDriver"; /s:w^g~
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; n#BvW,6J
uid = "system"; IU|kNBo
pwd = "manager"; y;nvR6)
Class.forName(className); r|
f-_D
Connection cn = DriverManager.getConnection(url,uid,pwd); H?tUCbw
2)用jndi(java的命名和目录服务)方式 oV9z(!X/
例子 03EV%Vc
String jndi = "jdbc/db"; +Q)ULnie e
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); x?
N.WABr;
DataSource ds = (DataSource) ctx.lookup(jndi); C/G]v*MBQ
Connection cn = ds.getConnection(); "(,2L,Zh
多用于jsp中 f2yq8/J8.
2、执行sql语句 9_ZBV{
1)用Statement来执行sql语句 yHNuU)Ft
String sql; ,}0$Tv\1
Statement sm = cn.createStatement(); ]]TqP{H
sm.executeQuery(sql); // 执行数据查询语句(select) xvmt.> f
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); H\E7o"m
2)用PreparedStatement来执行sql语句 %X>FVlPm
String sql; gO='A(Y
sql = "insert into user (id,name) values (?,?)"; ]tB@kBi "
PreparedStatement ps = cn.prepareStatement(sql); f#$|t>
ps.setInt(1,xxx);
R_1qn
ps.setString(2,xxx); @QdnjXII*
... +@ MPQv
ResultSet rs = ps.executeQuery(); // 查询 s\gp5MT
int c = ps.executeUpdate(); // 更新 SO;N~D1Z6
2no$+4+z
3、处理执行结果 ;~+]! U
查询语句,返回记录集ResultSet lpy:3`ti
更新语句,返回数字,表示该更新影响的记录数 bb;(gK;F
ResultSet的方法 Izn
T|l^
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ~~nqU pK?v
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 JJ?I>S N!
h/2/vBs
4、释放连接 rkDi+D6`q
cn.close(); u7s"0f`
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection GqLq gns
{6*#3m
Kk
可滚动、更新的记录集 7 Wl-n
1、创建可滚动、更新的Statement ~$<UE}qp
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); CqFeF?xd8h
该Statement取得的ResultSet就是可滚动的 uSN"vpc4D
2、创建PreparedStatement时指定参数 $DebXxJw0l
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 4w4^yQE
ResultSet.absolute(9000); khx.yRx
批量更新 c.%.\al8oW
1、Statement XF*.Jg]
Statement sm = cn.createStatement(); 2&he($HIzg
sm.addBatch(sql1); KjYAdia:H
sm.addBatch(sql2); ;3"@g]e
... 1J{fXh
sm.executeBatch() <T+!V-Pj*
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 &!L:"]=+
2、PreparedStatement P4k;O?y
PreparedStatement ps = cn.preparedStatement(sql); #.._c?%4/
{ Y$<D9fs3
ps.setXXX(1,xxx); pKT2^Q}-h
... ]Gv!M?:
ps.addBatch(); RWKH%C[Yd
} FhkkWWL
ps.executeBatch(); +G*JrwJ&=
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 c_.-b=zm
4)kG-[#
事务的处理 .Z\Q4x#!Z
1、关闭Connection的自动提交 YoKs:e2/:
cn.setAutoCommit(false); $q_R?Eay
2、执行一系列sql语句 %m&@o~+
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close &~~wX,6+
Statement sm ; &nj&:?w
sm = cn.createStatement(insert into user...); "m$3)7 $
sm.executeUpdate(); "6CMA0R
sm.close(); KxzYfH
sm = cn.createStatement("insert into corp...); `~#<&w
sm.executeUpdate(); =*Z5!W'd
sm.close();
4!.(|h@
3、提交 ,q#0hy%5/
cn.commit(); 2`?!+")
4、如果发生异常,那么回滚 upy\gkpnGO
cn.rollback();