java 数据库基本操作
MoP0qNk
1、java数据库操作基本流程 SW%d'1ya
2、几个常用的重要技巧: aTy&"
可滚动、更新的记录集 _,4f z(
批量更新 V+l>wMeo
事务处理 uU]4)Hp
ou@ P#:<B
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 )#dP:
1、取得数据库连接 }A"%YDrNbG
1)用DriverManager取数据库连接 Y<S,Xr;J:
例子 (HkMubnqg
String className,url,uid,pwd; ,Mwj`fgh
className = "oracle.jdbc.driver.OracleDriver"; >p 7e6%
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; m+Yj"RMx&
uid = "system"; G =+ sW
pwd = "manager"; ~WJEH#
Class.forName(className); bg)yliX
Connection cn = DriverManager.getConnection(url,uid,pwd); (k..ll p~
2)用jndi(java的命名和目录服务)方式 XoaB X2
例子 Gu:aSb
String jndi = "jdbc/db"; ;
. c]0
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); g9;}?h
DataSource ds = (DataSource) ctx.lookup(jndi); GIDC'
Connection cn = ds.getConnection(); KPUc+`cN%
多用于jsp中 !R WX1Z
2、执行sql语句 RCq_FY
1)用Statement来执行sql语句 ;%#@vXH[Oo
String sql; wYS,|=y
Statement sm = cn.createStatement(); rK2*DuE
sm.executeQuery(sql); // 执行数据查询语句(select) Ov)rsi
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); G~e`O,+
2)用PreparedStatement来执行sql语句 4y+]V~p
String sql; cV5Lp4wY?
sql = "insert into user (id,name) values (?,?)"; 13Ee"r
PreparedStatement ps = cn.prepareStatement(sql); Tc`LY/%Od
ps.setInt(1,xxx); d]k>7.
ps.setString(2,xxx); y?M99Vo4?
... %9=^#e+pE
ResultSet rs = ps.executeQuery(); // 查询 R/iw#.Yy
int c = ps.executeUpdate(); // 更新 lFD$Mc
\,E;b{PQo6
3、处理执行结果 !+T+BFw.
查询语句,返回记录集ResultSet XWbe|K!e
更新语句,返回数字,表示该更新影响的记录数 +MeEy{;
ResultSet的方法 M,PZ|=V6a
1、next(),将游标往后移动一行,如果成功返回true;否则返回false G;MgrA#\
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ;EE*#"IJ
;/SM^&Y
4、释放连接 ^ ;$f-e
cn.close(); VzMoWD;
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection w'.ny<Pe
s&M6DFlA
可滚动、更新的记录集 kN;l@>
1、创建可滚动、更新的Statement Tfgx>2
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); #Qy*zU#9
该Statement取得的ResultSet就是可滚动的 z_<
7T4
2、创建PreparedStatement时指定参数 u/cL[_Q
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); &|26x
>
ResultSet.absolute(9000); r+>E`GGQ
批量更新 p(~>u'c
1、Statement 4fZ$&)0&
Statement sm = cn.createStatement(); ALwkX"AN
sm.addBatch(sql1); Jnm{i|6N
sm.addBatch(sql2); #=b_!~:%
... ^Y~ ,s
sm.executeBatch() gV!Eotq
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 C&3#'/&
2、PreparedStatement PT|^RF%fT
PreparedStatement ps = cn.preparedStatement(sql); OtF{=7
{ OcMd'fwO
ps.setXXX(1,xxx); Yk:fV &]
... ?a~=CC@
ps.addBatch(); 9ToM5oQ
} 7|T5N[3?l,
ps.executeBatch(); -^$CGRE6A
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 <{YP=WYW
/[GOs*{zB
事务的处理 \%EZg
1、关闭Connection的自动提交 #:vos VqG
cn.setAutoCommit(false); 2sy{
2、执行一系列sql语句 [lQp4xgxi
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close IL}pVa00{n
Statement sm ; ,<|EoravH
sm = cn.createStatement(insert into user...); p2!x8`IB*
sm.executeUpdate(); FI*.2rdSR
sm.close(); H<%7aOwO2
sm = cn.createStatement("insert into corp...); iyu%o9_0
sm.executeUpdate(); CTR|b}!
sm.close(); >('L2]4\v
3、提交 @+Berb
cn.commit(); U-3KuR+0
4、如果发生异常,那么回滚 Fmt5"3B
cn.rollback();