java 数据库基本操作 gB%"JDn8
1、java数据库操作基本流程 RnC+]J+?4
2、几个常用的重要技巧: V^!^wLLi
可滚动、更新的记录集 [jCYj0Qf8
批量更新 ;K7kBp\d
事务处理 a;Pn.@NVq
X.
Ur`X
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 EUh_`R
1、取得数据库连接 x|AND]^Q
1)用DriverManager取数据库连接 .nNZdta&=
例子 mJ(ElDG
String className,url,uid,pwd; Y~!A"$
className = "oracle.jdbc.driver.OracleDriver"; Jqgm>\y
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; gH,Pz
uid = "system"; k{S8q?Gc
pwd = "manager"; p{v*/<.;
Class.forName(className); $0OOH4
Connection cn = DriverManager.getConnection(url,uid,pwd); G; exH$y
2)用jndi(java的命名和目录服务)方式 r|]YS6
例子 q$b4S4Z7
String jndi = "jdbc/db"; !;vv-v,LQ
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); VR1[-OE
DataSource ds = (DataSource) ctx.lookup(jndi); {98e_z w
Connection cn = ds.getConnection(); vf#d
多用于jsp中 rH,@"(p\
2、执行sql语句 L^Q;M,.c;
1)用Statement来执行sql语句 VpB)5>
String sql; L<iRqayn
Statement sm = cn.createStatement(); 79}jK"Gc
sm.executeQuery(sql); // 执行数据查询语句(select) MwQ4&z#wh
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); O^6anUV0
2)用PreparedStatement来执行sql语句 D@.qdRc3
String sql; @^ti*`
sql = "insert into user (id,name) values (?,?)"; y3j"vKG
PreparedStatement ps = cn.prepareStatement(sql); d-m.aP)y:
ps.setInt(1,xxx); ux!YVvTPd
ps.setString(2,xxx); ]xoG{%vgb
... C4gES"T
ResultSet rs = ps.executeQuery(); // 查询 1tI=Dwx
int c = ps.executeUpdate(); // 更新 .9r85
%{3q=9ii
3、处理执行结果 qP&:9eL
查询语句,返回记录集ResultSet B/;'D7i|S
更新语句,返回数字,表示该更新影响的记录数 $%'3w~h`
ResultSet的方法 vGPsjxk&
1、next(),将游标往后移动一行,如果成功返回true;否则返回false wD$UShnm9-
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 =O8>[u;
S-3hLw&?
4、释放连接 RjgJIVm(
cn.close(); ":s_O.
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection WcM\4q@
>KdV]!H
可滚动、更新的记录集 X's<+hK&
1、创建可滚动、更新的Statement #pK"
^O*!
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); S-Bx`e9 '
该Statement取得的ResultSet就是可滚动的 i'>5vU0?3
2、创建PreparedStatement时指定参数 goF87^M
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); [eOv fD
ResultSet.absolute(9000); (dQ=i
批量更新 ,d* hhe
1、Statement 1iLU{m9
Statement sm = cn.createStatement(); [.Kp/,JY
sm.addBatch(sql1); 1kvs2
sm.addBatch(sql2); |</) 6r
... (C).Vj~
sm.executeBatch() W\w#}kY
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 4*E5@{D
2、PreparedStatement pWv1XTs@t:
PreparedStatement ps = cn.preparedStatement(sql); q TN)2G
{
Su?cC/
ps.setXXX(1,xxx); H|wP8uQC
... ]{\M,txo8
ps.addBatch(); 1(:!6PY
} &|RTLGwX
ps.executeBatch(); vlEW{B;)Z
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 7:b.c
eMFxdtH
事务的处理 { %]imf|g.
1、关闭Connection的自动提交 hLk6Hqr7
cn.setAutoCommit(false); %OO}0OW
2、执行一系列sql语句 b.\xPb
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ).(y#zJ7P
Statement sm ; *W^ZXhrZ
sm = cn.createStatement(insert into user...); %8xRT@Q
sm.executeUpdate(); x{<l8vL=-c
sm.close(); E!mv}
sm = cn.createStatement("insert into corp...); 02*qf:kTnA
sm.executeUpdate(); Ov?J"B'F
sm.close(); IOuqC.RJ}o
3、提交 +Y~5197V
cn.commit(); kL0K[O
4、如果发生异常,那么回滚 -]D/8,|s
cn.rollback();