java 数据库基本操作 /N)5
3!LT
1、java数据库操作基本流程 Pxhz@":[
2、几个常用的重要技巧: 0oU=RbC
可滚动、更新的记录集 Lw*]EG|?
批量更新 5PZN^\^
事务处理 6^#uLp>
`cr(wdvI
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 [pgZbOIN37
1、取得数据库连接 ^0tw%6:
1)用DriverManager取数据库连接 @Bs0Avj.
例子 mm[SBiFO\
String className,url,uid,pwd; otr>3a*'
className = "oracle.jdbc.driver.OracleDriver"; 7=P^_LcU
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; o
}@n>R
uid = "system"; V U~Dk);Bv
pwd = "manager"; #Hu~}zy
Class.forName(className); "0&N}
Connection cn = DriverManager.getConnection(url,uid,pwd); G'x .NL
2)用jndi(java的命名和目录服务)方式 E\{< ;S
例子 vR>o}%`
String jndi = "jdbc/db"; pOga6'aB)
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); H4<Nnd\
DataSource ds = (DataSource) ctx.lookup(jndi); C!%:o/
Connection cn = ds.getConnection(); h`5)2n+ P
多用于jsp中 XU-m"_t
2、执行sql语句 nWWM2v
1)用Statement来执行sql语句 8`v$liH
String sql; uQeu4$k!
Statement sm = cn.createStatement(); bAF )Bli
sm.executeQuery(sql); // 执行数据查询语句(select) Ec]|p6a3
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Yrn"saVc,
2)用PreparedStatement来执行sql语句 Jx|I6y
String sql; !/I0i8T
sql = "insert into user (id,name) values (?,?)"; \u{8Bak0
PreparedStatement ps = cn.prepareStatement(sql); RL}KAGK
ps.setInt(1,xxx); 5bX6#5uP1
ps.setString(2,xxx); Cg!^S(U4
... X-JV'KE}^z
ResultSet rs = ps.executeQuery(); // 查询 HGDVOJq
int c = ps.executeUpdate(); // 更新 |M5-5)
UAYd?r
3、处理执行结果 )\ 0F7Z
查询语句,返回记录集ResultSet 5/I_w0
更新语句,返回数字,表示该更新影响的记录数 !3}deY8;#
ResultSet的方法 {0yu
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 85 ]SC$
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 `M@Ak2gcR+
Y2T$BJJ
4、释放连接 kA#vByf`v
cn.close(); 6*XM7'n
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 8 i0
hW2.8f$
可滚动、更新的记录集 O/OiQ^T
1、创建可滚动、更新的Statement py<_HyJ
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); \2X$C#8E
该Statement取得的ResultSet就是可滚动的 n:#TOU1ix<
2、创建PreparedStatement时指定参数 F0dI/+
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); uV]ULm#,i
ResultSet.absolute(9000); *l>0t]5YH
批量更新 [CN$ScK,
1、Statement $3P`DJo
Statement sm = cn.createStatement(); ,Og4
?fS
sm.addBatch(sql1); _ PWj(});
sm.addBatch(sql2); %mI~
=^za
... JMyTwj[7
sm.executeBatch() f3PMVf:<
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 z&+
zl6
2、PreparedStatement )0CQP
PreparedStatement ps = cn.preparedStatement(sql); H;KDZO9W
{ 1dG06<!
ps.setXXX(1,xxx); B~gV'(9g
... Z<z;L<tJ 9
ps.addBatch(); VOgi7\
} OtUrGQP
ps.executeBatch(); eaZQ2
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 7'w0
r%=[},JQ
事务的处理 _p}xZD\?,
1、关闭Connection的自动提交 +m$5a
YX
cn.setAutoCommit(false); #V_GOy1-
2、执行一系列sql语句 VWf %v
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close /iM$Tb5
Statement sm ; YUkud2,j
sm = cn.createStatement(insert into user...); @LX6hm*}
sm.executeUpdate(); M] EsS^/X
sm.close(); )pgrl
sm = cn.createStatement("insert into corp...); `y!/F?o+!
sm.executeUpdate(); @h?crJ6$
sm.close(); &a)vdlZSE=
3、提交 OkH\^
cn.commit(); grcbH
4、如果发生异常,那么回滚 p2pAvlNoF
cn.rollback();