java 数据库基本操作 /]>8V'e\
1、java数据库操作基本流程 Sece#K2J|
2、几个常用的重要技巧: HY>zgf,0
可滚动、更新的记录集 ?Jy/]j5fI
批量更新 5e|yW0o
事务处理 ,.,spoV
4qvE2W}&
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 8D:0Vhx\I
1、取得数据库连接 Y:#nk.}>
1)用DriverManager取数据库连接 kT1 2
例子 Dhze2q)o
String className,url,uid,pwd; Ra)AQ
n
className = "oracle.jdbc.driver.OracleDriver"; _/[}PQC6G
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; S17 c#6vT
uid = "system"; ^_5t5>
pwd = "manager"; d]r?mnN W
Class.forName(className); 155vY
Connection cn = DriverManager.getConnection(url,uid,pwd); C.N#y`g
2)用jndi(java的命名和目录服务)方式 LCMZw6p
例子 <Gw>}/-^
String jndi = "jdbc/db"; reI4!,x
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); +"GBuNh
DataSource ds = (DataSource) ctx.lookup(jndi); bx._,G
Connection cn = ds.getConnection(); |y.^F3PE
多用于jsp中 U-:"Wx%G
2、执行sql语句 \m%Z;xKG
1)用Statement来执行sql语句 %n)H(QPW
String sql; vlVHoF;&
Statement sm = cn.createStatement(); {YMO8
sm.executeQuery(sql); // 执行数据查询语句(select) ,vs# (d6 G
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); hq*"S-N
2)用PreparedStatement来执行sql语句 uWDWf5@
String sql; 4`zK`bRcK#
sql = "insert into user (id,name) values (?,?)"; }CGA)yK~3
PreparedStatement ps = cn.prepareStatement(sql); PfjD!=yS=h
ps.setInt(1,xxx); H84Zg/ ^
ps.setString(2,xxx); f~P~%
... 34c+70x7
ResultSet rs = ps.executeQuery(); // 查询 8z)J rO}
int c = ps.executeUpdate(); // 更新 K)N'~jCG
S=_*<[W%4
3、处理执行结果 }P\ J?8
查询语句,返回记录集ResultSet kHz?vVE/l
更新语句,返回数字,表示该更新影响的记录数 rk8Cea
ResultSet的方法 Dj9ecV`
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 4)Ab]CdD
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 E>isl"
pv"QgH
4、释放连接 zXaA5rZO
cn.close(); 2ut)m\)/)
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection .g>0FP
XE($t2x,M
可滚动、更新的记录集 $Y?[[>u
1、创建可滚动、更新的Statement fM!@cph(8
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 1qm
_Qs&
该Statement取得的ResultSet就是可滚动的 {xu~Dx
2、创建PreparedStatement时指定参数 <V1y^EW0
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); s)~Wcp'+M:
ResultSet.absolute(9000); $J9/AFzO"
批量更新 4Hq6nT/
1、Statement [oG
Sy5bB
Statement sm = cn.createStatement(); "?S>}G\
sm.addBatch(sql1); Rc(E';uc
sm.addBatch(sql2); }m93AL_y
... w~ O)DhC
sm.executeBatch() *hlinQKs
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 [13NhF3.P
2、PreparedStatement D:0?u_[W
PreparedStatement ps = cn.preparedStatement(sql); zb. ^p
X
{ 1
&-%<o
ps.setXXX(1,xxx); %@^9(xTE
... Pf#DBW*
ps.addBatch(); >A>_UT_"
} DbrK,'b%
ps.executeBatch(); lS |:4U.
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Z+agS8e(
icN#8\E
事务的处理 NszqI
1、关闭Connection的自动提交 TXbnK"XQ
cn.setAutoCommit(false); K`8$+JDP+
2、执行一系列sql语句 m+3]RIr&A
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 51'{Jx8
Statement sm ; 9 E2OCLWrE
sm = cn.createStatement(insert into user...); /NUu^ N
sm.executeUpdate(); %9b TfX"
sm.close(); Sh(XFUJ
sm = cn.createStatement("insert into corp...); {nH*Wu*^
sm.executeUpdate(); xG:7AGZ$[
sm.close(); oH1]-Nl$
3、提交 [[uZCKi
cn.commit(); UUEbtZH;
4、如果发生异常,那么回滚 j"9Zaq_
cn.rollback();