java 数据库基本操作 ~u!gUJ:
1、java数据库操作基本流程 \[cH/{nt
2、几个常用的重要技巧: w5,6$#
可滚动、更新的记录集 U M@naU
批量更新 /M:H9Z8!
事务处理 \4aKLr
jA,|JgN|n
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 "MTWjW*6
1、取得数据库连接 e|VJ9|;3
1)用DriverManager取数据库连接 J2'K?|,m
例子 7ZQ'h3K
String className,url,uid,pwd; |ixGY^3;
className = "oracle.jdbc.driver.OracleDriver"; IdF$Ml#[h
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 0rcjorWI
uid = "system"; D{R/#vM jk
pwd = "manager"; l2(.>-#
Class.forName(className); ' X}7]y
Connection cn = DriverManager.getConnection(url,uid,pwd); ^T{8uJ'kn
2)用jndi(java的命名和目录服务)方式 [yC"el6PM
例子 Ih()/(
String jndi = "jdbc/db"; WV2~(/hX&
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); [%jxf\9jJ_
DataSource ds = (DataSource) ctx.lookup(jndi); uWTN2jr
Connection cn = ds.getConnection(); 9
Va40X1
多用于jsp中 *qG$19b
2、执行sql语句 Y#`Lcg+r,
1)用Statement来执行sql语句 ~5ubh2{
String sql; |YRY!V_w
Statement sm = cn.createStatement(); D
M}s0O$0
sm.executeQuery(sql); // 执行数据查询语句(select) 9^!wUwB
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); .EG*+,
2)用PreparedStatement来执行sql语句 g#qNHR
String sql; -E]Sk&4Gj
sql = "insert into user (id,name) values (?,?)"; H<Hrwy~
PreparedStatement ps = cn.prepareStatement(sql); ]H+{eJB7O
ps.setInt(1,xxx); Af9+HI
O
ps.setString(2,xxx); ]^ #`j
... \vVSh
ResultSet rs = ps.executeQuery(); // 查询 s^cc@C
int c = ps.executeUpdate(); // 更新 KmL$M
_88QgThb
3、处理执行结果 .LObOR5J7
查询语句,返回记录集ResultSet :+:6_x
更新语句,返回数字,表示该更新影响的记录数 f05=Mc&)
ResultSet的方法 sT`^ljp4
1、next(),将游标往后移动一行,如果成功返回true;否则返回false o%`npi1y
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 vbp-`M(
`
8UWE {
4、释放连接 ?/'}JS(Sm
cn.close(); s}ADk-7
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection e:OyjG5_
^=0$
可滚动、更新的记录集 sofu
1、创建可滚动、更新的Statement h!e2
+4{4{
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); nJT4w|Yx
该Statement取得的ResultSet就是可滚动的
<uD qYT$6
2、创建PreparedStatement时指定参数 @Tr&`Hi
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ^.vmF>$+I
ResultSet.absolute(9000); >zmzK{A=
批量更新 a4&:@`=
1、Statement Uo6(|mm
Statement sm = cn.createStatement(); VE]6wwV2
sm.addBatch(sql1); CCqT tp
sm.addBatch(sql2); M&y5AB0
... <'&F;5F3V
sm.executeBatch() p)3nyN=|_
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 "K?Q
2、PreparedStatement 9&K/GaG
PreparedStatement ps = cn.preparedStatement(sql); P^[/Qi}j
{ O?ktWHUx
ps.setXXX(1,xxx); i2PZ'.sL
... z(H?VfJo
ps.addBatch(); PLdn#S}.
} >uy%-aXiVa
ps.executeBatch(); |nY~ZVTt/
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 G {b:i8}l
y
~AmG~
事务的处理 D.*>;5:0'
1、关闭Connection的自动提交 A#DR9Eq
cn.setAutoCommit(false); z[9UQU~x?
2、执行一系列sql语句 Sj-[%D*
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 6GINmkA
Statement sm ; M35Ax],:^
sm = cn.createStatement(insert into user...); rLF*DB3l
sm.executeUpdate(); B~TN/sd
sm.close(); ^%#grX#
sm = cn.createStatement("insert into corp...); M{Gxjmdx
sm.executeUpdate(); AhxGj+
sm.close(); B QjGv?p0s
3、提交 )q3"t2-
cn.commit(); uGCp#>+
4、如果发生异常,那么回滚 p=gX!4,9<
cn.rollback();