java 数据库基本操作 orvp*F{7[H
1、java数据库操作基本流程 -
CWywuD
2、几个常用的重要技巧: 65m"J'
可滚动、更新的记录集 ^Q^_?~h*!
批量更新 -o.:P>/
事务处理 W"3ph6[eW
"x /OIf
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 _Y[bMuUb=
1、取得数据库连接 [66!bM&
1)用DriverManager取数据库连接 uXq.
]ub
例子 gl_^V&c
String className,url,uid,pwd; TNr :pE<
className = "oracle.jdbc.driver.OracleDriver"; BV+ Bk+
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; S/I /-Bp~
uid = "system"; (2
a`XwR
pwd = "manager"; .-X8J t
Class.forName(className); :U(A;U1,
Connection cn = DriverManager.getConnection(url,uid,pwd); ;]jNk'oa
2)用jndi(java的命名和目录服务)方式 %9RF
例子 !#"zTj
String jndi = "jdbc/db"; =4!e&o
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); C\/L v.
DataSource ds = (DataSource) ctx.lookup(jndi); O<;3M'y\
Connection cn = ds.getConnection(); 0,8okAH
多用于jsp中 |id
<=Xf
2、执行sql语句 wg]LVW}
1)用Statement来执行sql语句 @jlw_ob2g
String sql; bNoW?8bZ
Statement sm = cn.createStatement(); z%LIX^q9
sm.executeQuery(sql); // 执行数据查询语句(select) HgkC~'
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); E`k@{*Hn&
2)用PreparedStatement来执行sql语句 qWKAM@
String sql; ]P2"[y
sql = "insert into user (id,name) values (?,?)"; $"&{aa
PreparedStatement ps = cn.prepareStatement(sql); BFJnV.0M!
ps.setInt(1,xxx); [R7Y}k:9U
ps.setString(2,xxx); s&!a
... '-/xyAzS
ResultSet rs = ps.executeQuery(); // 查询 k,F6Tx
int c = ps.executeUpdate(); // 更新 xpx\=iAe
A6iq[b]
3、处理执行结果 Nl(3Xqov
查询语句,返回记录集ResultSet fe#\TNeQJ[
更新语句,返回数字,表示该更新影响的记录数 D+7Rz_=
ResultSet的方法 q=qcm`ce
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Mzw X>3x
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 H ?y,ie#u
CoAvSw
4、释放连接 {Fe[:\
cn.close(); -{vKus
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection +V^;.P</
M|(Q0 _8
可滚动、更新的记录集 td3D=Y
1、创建可滚动、更新的Statement f!
.<$ih
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); _aMPa+D=P
该Statement取得的ResultSet就是可滚动的 Yr=Y@~ XL
2、创建PreparedStatement时指定参数 6;qy#\}2
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 3fJc
9|
ResultSet.absolute(9000); @<]Ekkg
批量更新 h@WhNk7"xa
1、Statement ">jj
Statement sm = cn.createStatement(); {Wu$YWE*sx
sm.addBatch(sql1); SrK<fAkx
sm.addBatch(sql2); ye? 'Ze
... c>~*/%+
sm.executeBatch() rkY[E(SY
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 A;|D:;x3G
2、PreparedStatement %zw1}|s#z
PreparedStatement ps = cn.preparedStatement(sql); ;H.^i|_/
{ ZH)="qx[
ps.setXXX(1,xxx); &&RimoIeo
... 6ez<g
Uf
ps.addBatch(); t=O8f5Pf{
} KC#q@InK
ps.executeBatch(); 8rS:5:Hi
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 X~,aNRy
} c}_<#I
事务的处理 w+E,INdi
1、关闭Connection的自动提交 pKrN:ExB"\
cn.setAutoCommit(false); Yv!a88+A8M
2、执行一系列sql语句 E6gI,f/p0X
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ]Y8<`;8/
Statement sm ; )Z ?Ym.0/
sm = cn.createStatement(insert into user...); t9:0TBt-[
sm.executeUpdate(); .oUTqki
sm.close(); *zL}&RUKM
sm = cn.createStatement("insert into corp...); <=0
u2~E
sm.executeUpdate(); Zt.|oYH$
sm.close(); K_ ~"}
3、提交 ^ tg<K
cn.commit(); wInh~p
4、如果发生异常,那么回滚 RnI&8
cn.rollback();