java 数据库基本操作 ]C^*C|
1、java数据库操作基本流程 6FAP *V;
2、几个常用的重要技巧: 4\iQ%fb
可滚动、更新的记录集 ;bmd<1
批量更新 J>&GP#7}
事务处理 4(]('[M
HX^
P9jXT
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 =25"qJr
1、取得数据库连接 )Qp?LECrt
1)用DriverManager取数据库连接 "[,XS`
例子 rZ7 Ihof
String className,url,uid,pwd; %&NK|M+n
className = "oracle.jdbc.driver.OracleDriver"; ^hJ,1{o
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; efm<bJB2
uid = "system"; 0cVXUTJ|W
pwd = "manager"; K>~l6
Class.forName(className); S6I8zk)Z4
Connection cn = DriverManager.getConnection(url,uid,pwd); > ^}z
2)用jndi(java的命名和目录服务)方式 ~{{:-XkVB
例子 qlP=Y .H
String jndi = "jdbc/db"; s:{%1 /
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); (6b%;2k
DataSource ds = (DataSource) ctx.lookup(jndi); ':@qE\(
Connection cn = ds.getConnection(); 9wzYDKN}
多用于jsp中 j/\XeG>
2、执行sql语句 .`9KB3
1)用Statement来执行sql语句 Mf"B!WU>]B
String sql; stScz#!
Statement sm = cn.createStatement(); n9yxZu
sm.executeQuery(sql); // 执行数据查询语句(select) ;o=mL_[
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Qw+">
2)用PreparedStatement来执行sql语句 J.(_c'
r
String sql; ,GlK_-6>
sql = "insert into user (id,name) values (?,?)"; f
#14%?/
PreparedStatement ps = cn.prepareStatement(sql); Dc2eY.
ps.setInt(1,xxx); 7085&\9
ps.setString(2,xxx); a gzG
... YXEZ&$e'
ResultSet rs = ps.executeQuery(); // 查询 jXQ_7
int c = ps.executeUpdate(); // 更新 Q)/q h;Ru
i)ctrdP-
3、处理执行结果 =r2d{
查询语句,返回记录集ResultSet ?aui q
更新语句,返回数字,表示该更新影响的记录数 fyeS)
ResultSet的方法 ]Ea6Z
1、next(),将游标往后移动一行,如果成功返回true;否则返回false .nN7*))Fj
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ~%ZO8X:^
%K4-V5f
4、释放连接 iD~s,
cn.close(); hb{(r@[WHv
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection bB["Qd}Q
@2<J_Ja
可滚动、更新的记录集 ~Q0}>m,S
1、创建可滚动、更新的Statement Yv)/DsSyL
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Et(prmH
该Statement取得的ResultSet就是可滚动的 P:+:Cm<
2、创建PreparedStatement时指定参数 Syb:i(Y
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); iGIaZ!j aW
ResultSet.absolute(9000); {iRNnh
批量更新 "Q( 8FF
1、Statement pWqahrWh
Statement sm = cn.createStatement(); SzDi=lY
sm.addBatch(sql1); *SZ<ori
sm.addBatch(sql2); ]cD!~nJ
... *4bV8T>0Z
sm.executeBatch() 2= _.K(
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 #"|Ey6&
2、PreparedStatement cVMTT]cj1
PreparedStatement ps = cn.preparedStatement(sql); 3
V<8
{ jB;+tDC!Co
ps.setXXX(1,xxx); %AFy{l
... R?(j#bk
ps.addBatch(); GUxhCoxb
} 6ZE]7~X
ps.executeBatch(); N78Ev7PN
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 )L?Tq"hy
Z=xrjE
事务的处理 |[ge,MO:
1、关闭Connection的自动提交 c=5$bo]LI
cn.setAutoCommit(false); C,E 5/XW
2、执行一系列sql语句 b#F3,T__`Y
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close >HDK<1 >
Statement sm ; _Cxs"to
sm = cn.createStatement(insert into user...); anbr3L[!
sm.executeUpdate(); ZO,]h9?4
sm.close(); _Cs.%R!r
sm = cn.createStatement("insert into corp...); +hfl.OBy
sm.executeUpdate(); ;O CYx[|
sm.close(); G8SJ<\?
3、提交 p=zjJ~DVd
cn.commit(); U*Q$:%72vO
4、如果发生异常,那么回滚 ^%nAx| 4xQ
cn.rollback();