java 数据库基本操作 8{h:z
9]J
1、java数据库操作基本流程 _A%z^&k(i
2、几个常用的重要技巧: %tpt+N?
可滚动、更新的记录集 vU~#6sl
批量更新 *8MU,6
事务处理 cG^'Qm
&z,w0FOre
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 MMcHzRF
1、取得数据库连接 -i 6<kF-W
1)用DriverManager取数据库连接 !O $EVl
例子 Eb#0-I
String className,url,uid,pwd; < FN[{YsA
className = "oracle.jdbc.driver.OracleDriver"; LM<OYRB(
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; !d"J,. )
uid = "system"; L$Ss]Ar=
pwd = "manager"; YK_a37E{F
Class.forName(className); 3Vt-]DGX
Connection cn = DriverManager.getConnection(url,uid,pwd); 7@C:4c@0
2)用jndi(java的命名和目录服务)方式 cMtkdIO
例子 C}W/9_I6Uo
String jndi = "jdbc/db"; 4Tq%V|5"&
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); whRc YnJ
DataSource ds = (DataSource) ctx.lookup(jndi); GyT{p#l
Connection cn = ds.getConnection(); qzmY]N+w|
多用于jsp中 (R Ttz
2、执行sql语句 8Zwq:lV Q
1)用Statement来执行sql语句 \Mt(9jNK
String sql; [NH[n#
Statement sm = cn.createStatement(); q.rn ZU
sm.executeQuery(sql); // 执行数据查询语句(select) GHH1jJ_[7
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); VNA VdP
2)用PreparedStatement来执行sql语句 O cm
String sql; ZJI|762,
sql = "insert into user (id,name) values (?,?)"; MW`q*J`Yo
PreparedStatement ps = cn.prepareStatement(sql); -l$]>J~
ps.setInt(1,xxx); JCS$Tm6y<_
ps.setString(2,xxx); ~`
#t?1SP
... $t[`}I
}
ResultSet rs = ps.executeQuery(); // 查询 .4.zy]I
int c = ps.executeUpdate(); // 更新 |A}E/=HPU
!QP~#a%
3、处理执行结果 Fi1gM}>py
查询语句,返回记录集ResultSet piY=(y&3
更新语句,返回数字,表示该更新影响的记录数 P ,5P6Y9
ResultSet的方法 @P[Tu; 4
1、next(),将游标往后移动一行,如果成功返回true;否则返回false [u/g =^+u
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 k>U&Us0
Mg-Kh}U
4、释放连接 (CO8t~J=
cn.close(); Vcc/
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection YVqhX]/
0SA
c1
可滚动、更新的记录集 +'Tr>2V
1、创建可滚动、更新的Statement VA.:'yQtJ
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); :] {+3A
该Statement取得的ResultSet就是可滚动的 vU&gFEWg
2、创建PreparedStatement时指定参数 !:a
pu!
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); !<@k\~9^D
ResultSet.absolute(9000); 4vGkgH<,
批量更新 kcM9
,bG
1、Statement A)s
Statement sm = cn.createStatement(); $w#C;2k]N
sm.addBatch(sql1); jA<v<oV
sm.addBatch(sql2); ^|-x mUC
... ki=-0G*]
sm.executeBatch() q-X)tH_+w@
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 #Ubzh`v
2、PreparedStatement uFL~^vz
PreparedStatement ps = cn.preparedStatement(sql); %Mz(G-I.\
{ 7AHEzJh"
ps.setXXX(1,xxx); *ZF7m_8u{
... "JKrbgN@;L
ps.addBatch(); =H3 JRRS
} ,8cw jS2E
ps.executeBatch(); a[[u>oHyd
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 b.Z K1
Z?O aY4
事务的处理 =-1d m+P
1、关闭Connection的自动提交 fp|b@
cn.setAutoCommit(false); TOeJnk
2、执行一系列sql语句 l7
j3;Ly
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close KYu3dC'/,&
Statement sm ; N9Y,%lQ|B8
sm = cn.createStatement(insert into user...); Dwe_ytjpc
sm.executeUpdate(); uhbo/7d'7
sm.close(); (zCas}YAKI
sm = cn.createStatement("insert into corp...); `.>2h}op
sm.executeUpdate(); n$F&gx'^
sm.close(); |j#x}8[(
3、提交 -r_z,h|
cn.commit(); YFy5>*W
4、如果发生异常,那么回滚 aM,>LKNbQ
cn.rollback();