java 数据库基本操作 :w?7j_p#
1、java数据库操作基本流程 Y5-kj,CB
2、几个常用的重要技巧: 16@);Ot
可滚动、更新的记录集 o6?l/nJ
批量更新 (:Cc3
事务处理 $`vkw(;t)1
?An,-N-ezf
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 =p&sl;PsLw
1、取得数据库连接 el'j&I
1)用DriverManager取数据库连接 wk02[
例子 #@Ujx_F
String className,url,uid,pwd; _2jw,WKr
className = "oracle.jdbc.driver.OracleDriver"; Sue
6+p
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; bZ#X9fT
uid = "system"; (L|}`
pwd = "manager"; lug}
Uj
Class.forName(className); ):bu;3E
Connection cn = DriverManager.getConnection(url,uid,pwd); JCQ:+eqt
2)用jndi(java的命名和目录服务)方式 Q-R}qy5y
例子 lEfBe)7+
String jndi = "jdbc/db"; abZdGnc
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); rR!U;
DataSource ds = (DataSource) ctx.lookup(jndi); fr#Qz{
Connection cn = ds.getConnection(); ?Bu}.0ku-$
多用于jsp中 .v,bXU$@YG
2、执行sql语句 a{_ KSg
1)用Statement来执行sql语句 G\1J _al
String sql; IT1PPm
Statement sm = cn.createStatement(); Zu=kT}aGg
sm.executeQuery(sql); // 执行数据查询语句(select) 797X71>
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Z( #Ln
2)用PreparedStatement来执行sql语句 C6)R#
String sql; T_~KxQ
sql = "insert into user (id,name) values (?,?)"; 79z)C35~
PreparedStatement ps = cn.prepareStatement(sql); CT}' ")Bm
ps.setInt(1,xxx); hNO)~rt
ps.setString(2,xxx); l7Lj[d<n
...
_>v0R'
ResultSet rs = ps.executeQuery(); // 查询 M@O2
WB1ws
int c = ps.executeUpdate(); // 更新 _[1^s$
4p x_ZD#J
3、处理执行结果 Xb+3Xn0}&8
查询语句,返回记录集ResultSet MOyT< $
更新语句,返回数字,表示该更新影响的记录数 }Z-I2
=]
ResultSet的方法 ]-KV0H
1、next(),将游标往后移动一行,如果成功返回true;否则返回false F;a3
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 BVAr&cu
v?%3~XoH
4、释放连接 L *{QjH
cn.close(); 3`rIV*&_{
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Q)+Y}
!a4cjc(
可滚动、更新的记录集 C.HYS S
1、创建可滚动、更新的Statement 6oA~J]<
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); /p}{#DLB
该Statement取得的ResultSet就是可滚动的 WQ.i$ID/
2、创建PreparedStatement时指定参数 V{FE [v_
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); :;_#5
ResultSet.absolute(9000); cdN/Qy
批量更新 6s5b$x
1、Statement p6[#f96^u
Statement sm = cn.createStatement(); -s89)lUkS
sm.addBatch(sql1); >3+FZ@.iT
sm.addBatch(sql2);
Ft$^x-d
... C{)HlOW
sm.executeBatch() &PSTwZd
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 [%t3[p<)O
2、PreparedStatement 2x6<8J8v*
PreparedStatement ps = cn.preparedStatement(sql); W'V@
{ Hy;901( %
ps.setXXX(1,xxx); }
m6\C5
... w`0)x5
TGR
ps.addBatch(); k}-]W@UCa?
} :Dt\:`(r'
ps.executeBatch(); v#-E~;CcC
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 .
Jb?]n
Fj,(_^
事务的处理 h*G#<M
1、关闭Connection的自动提交 .P8-~?&M
cn.setAutoCommit(false); ;{]8>`im&4
2、执行一系列sql语句 -$OD }5ku#
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Kc-Y
Statement sm ; {:3.27jQ
sm = cn.createStatement(insert into user...); s><IykIi
sm.executeUpdate(); [h^f%
sm.close(); Ogd8!'\
sm = cn.createStatement("insert into corp...); ckAsGF_B~!
sm.executeUpdate(); V8\$`NEP
sm.close(); :cEd [Jm9
3、提交 -!i;7[N
cn.commit(); ,;7`{Nab
4、如果发生异常,那么回滚 ,zG <7~m
cn.rollback();