java 数据库基本操作 [ns&Y0Y`t
1、java数据库操作基本流程 t3K>\ :
2、几个常用的重要技巧: %{Xm5#m
可滚动、更新的记录集 PXR0 Yn
批量更新 svF*@(-P#
事务处理 Q.<giBh
A?\h|u<
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 2,+@#q
1、取得数据库连接 D.
77WjwQ
1)用DriverManager取数据库连接 :^K~t!@
例子 ~xP
Szf
String className,url,uid,pwd; :S#eg1y.w]
className = "oracle.jdbc.driver.OracleDriver"; vsjM3=
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; @f-0X1C."N
uid = "system"; 20n%o&kG]8
pwd = "manager"; MG;4M>H
Class.forName(className); rffVfw
Connection cn = DriverManager.getConnection(url,uid,pwd); {6ajsy5=
2)用jndi(java的命名和目录服务)方式 7eTA`@v5A
例子 |WQD=J%~(
String jndi = "jdbc/db"; L-B<nl
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); E9?phD
DataSource ds = (DataSource) ctx.lookup(jndi); \AL
f$88>@
Connection cn = ds.getConnection(); O+}qQNe<
多用于jsp中 R4ht6Vm3g)
2、执行sql语句 ,rJXy_
1)用Statement来执行sql语句 dq[Mj5eC
String sql; =@k%&* Y?
Statement sm = cn.createStatement(); h/B>S
sm.executeQuery(sql); // 执行数据查询语句(select) |6=p{y
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); N2.AKH
2)用PreparedStatement来执行sql语句 vad12WrG<
String sql; O6IB.
>T
sql = "insert into user (id,name) values (?,?)"; ^c:Fy+fb
PreparedStatement ps = cn.prepareStatement(sql); >pU:Gr
ps.setInt(1,xxx); P/EM :
ps.setString(2,xxx); T3`ludm^u
... h?bb/T+'
ResultSet rs = ps.executeQuery(); // 查询 v1a6?-
int c = ps.executeUpdate(); // 更新 c@v{`d
Y&/]O$<
3、处理执行结果 1hcjSO
查询语句,返回记录集ResultSet <SI}lQ'i
更新语句,返回数字,表示该更新影响的记录数 vjjSKP6B
ResultSet的方法 Q{B}ef
1、next(),将游标往后移动一行,如果成功返回true;否则返回false LM&y@"wfm
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 k)TSR5A
$Of0n` e
4、释放连接 nLV9<M
Zm
cn.close(); ooUk O
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection R(n^)^?
o.q/O)'V u
可滚动、更新的记录集 uYE`"/h,1e
1、创建可滚动、更新的Statement $95h2oXt
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); wn)JXR
该Statement取得的ResultSet就是可滚动的 .BFYY13H
2、创建PreparedStatement时指定参数 h6} lpd
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); <{~6}6o
ResultSet.absolute(9000); %/9
EORdeH
批量更新 `'V4PUe
1、Statement 765p/**
Statement sm = cn.createStatement(); SJIOI@\b
sm.addBatch(sql1); #>j.$2G>
sm.addBatch(sql2); 6;|n]m\Vd
... MNSbtT*^
sm.executeBatch() irN6g#B?
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Yv:55+ e!|
2、PreparedStatement C-iK$/U
PreparedStatement ps = cn.preparedStatement(sql); i86>]
{ [,TkFbDq"J
ps.setXXX(1,xxx); {J^lX/D
... V*W;OiE_3
ps.addBatch();
)c8j}
} /%Nr?V
ps.executeBatch(); $z+8<?YD
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 +|tC'gCnV
@-+Q#
Zz`
事务的处理 ^a#X9
1、关闭Connection的自动提交 .nyfYa+
cn.setAutoCommit(false); Nj?/J47?,
2、执行一系列sql语句 tO0!5#-VR
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close
=|9H
Statement sm ; $^@ )
sm = cn.createStatement(insert into user...); o`Ta("9^
sm.executeUpdate(); &gjF4~W]
sm.close(); Dgy]ae(Hb3
sm = cn.createStatement("insert into corp...); %Q.&ZhB
sm.executeUpdate(); .jj$ Kh q]
sm.close(); [o?*"c
3、提交 %JLk$sP9y`
cn.commit(); zL\OB?)5J
4、如果发生异常,那么回滚 |O"lNUW
cn.rollback();