java 数据库基本操作 S 6,4PP
1、java数据库操作基本流程 a`9L,8Ve
2、几个常用的重要技巧: BC>=B@H0
可滚动、更新的记录集 i=a-<A5x
批量更新 wCs^J48=
事务处理 s1Ok|31|
k;PAh>8
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 2A`A\19t
1、取得数据库连接 %m,6}yt
1)用DriverManager取数据库连接 Kr'f- {
例子 c'6g*%2k
String className,url,uid,pwd; hD,:w%M
className = "oracle.jdbc.driver.OracleDriver"; in <(g@Zg
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; $yDWu"R8
uid = "system"; vgt]:$
pwd = "manager"; M4LP$N
Class.forName(className); 8kE]_t
Connection cn = DriverManager.getConnection(url,uid,pwd); ;DA8B'^>
2)用jndi(java的命名和目录服务)方式 gwrYLZNGI
例子 `J<*9dq%
String jndi = "jdbc/db"; XLk<*0tp
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); j| Wv7
DataSource ds = (DataSource) ctx.lookup(jndi); 5S
Xn?
Connection cn = ds.getConnection(); K`&oC8p
多用于jsp中 f|A
riM
2、执行sql语句 ,)+o
1)用Statement来执行sql语句 Jk|Q`h
String sql; )C(>H93
Statement sm = cn.createStatement(); +:=(#Y
sm.executeQuery(sql); // 执行数据查询语句(select) :Eh\NOc_O
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); onCKI,"
2)用PreparedStatement来执行sql语句 *,C(\!b
!?
String sql; _$NIp `d
sql = "insert into user (id,name) values (?,?)"; q>f<u&
PreparedStatement ps = cn.prepareStatement(sql); C$Lu]pIL*
ps.setInt(1,xxx); t-
u VZ!`\
ps.setString(2,xxx); 'C$XS>S
... #1c]PX
ResultSet rs = ps.executeQuery(); // 查询 mC&=X6Q]
int c = ps.executeUpdate(); // 更新 682Z}"I0
n8=5-7UT
3、处理执行结果 uY_SU-v
查询语句,返回记录集ResultSet 3K&4i'}V
更新语句,返回数字,表示该更新影响的记录数 84HUBud76Y
ResultSet的方法 0`.^MC?
1、next(),将游标往后移动一行,如果成功返回true;否则返回false @J{m@ji{
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 AWjJ{#W>9
g,`A[z2
4、释放连接 f:*vr['d
cn.close(); ,y4I[[
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ZN"j%E{d
O1%pxX'`S
可滚动、更新的记录集 sb:d>6
1、创建可滚动、更新的Statement ]3ONFa
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); r`&-9"+
该Statement取得的ResultSet就是可滚动的 '[$)bPMHl
2、创建PreparedStatement时指定参数 ~vLW.:
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); gM>t0)mGK
ResultSet.absolute(9000); { pu85'DV
批量更新 QY/hI`
1、Statement DU%w1+u
Statement sm = cn.createStatement(); U<XSj#&8|
sm.addBatch(sql1); kK8itO
sm.addBatch(sql2); d\e7,"L*Q
... ]&Z))H
sm.executeBatch() &<zd.~N"
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 gh`m*@
2、PreparedStatement )%rg?lI
PreparedStatement ps = cn.preparedStatement(sql); 7\_o.(g#-
{ a{!QOX%K
ps.setXXX(1,xxx); pZ`|iLNl-
... jF`BjxrG
ps.addBatch(); FYs)MO
} Vz14j_
ps.executeBatch(); %1pYEHn
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 [{4MR%--
6nhMP$h
事务的处理 d]9U^iy
1、关闭Connection的自动提交 Bwr3jV?S
cn.setAutoCommit(false); '65LKD
2、执行一系列sql语句 I%|>2}-_U
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close zYXV;
Statement sm ; f}guv~K
sm = cn.createStatement(insert into user...); =U|N=/y#hJ
sm.executeUpdate(); gTRF^knrY
sm.close(); ?!qY,9lhH
sm = cn.createStatement("insert into corp...); Uax+dl
sm.executeUpdate(); Bq/:Nd[y
sm.close(); 7+./zN
3、提交 j4=(H:c~E
cn.commit(); zf3v5Hk
4、如果发生异常,那么回滚 }@if6(0
cn.rollback();