java 数据库基本操作 xHv|ca.E
1、java数据库操作基本流程 8lOZIbwS
2、几个常用的重要技巧: gHvW
e
可滚动、更新的记录集 #juGD9e
批量更新 7sud/*+F
事务处理 Sf'i{xye
$-$5ta{s
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接
8>Du
1、取得数据库连接 d<^_w!4X}
1)用DriverManager取数据库连接 [_
M6/
例子 -_2Dy1
String className,url,uid,pwd; dd\bI_
className = "oracle.jdbc.driver.OracleDriver"; [xtK"E#
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; |"CJ
uid = "system"; Ii~; d3.
pwd = "manager"; 0{0;1.ZP
Class.forName(className); [|a(
y6Q
Connection cn = DriverManager.getConnection(url,uid,pwd); uX<+hG.n}
2)用jndi(java的命名和目录服务)方式 h4XcKv+
例子 N 8:"&WM
String jndi = "jdbc/db"; ezcS[r
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); VLh%XoQx[
DataSource ds = (DataSource) ctx.lookup(jndi); <`c25ih.4
Connection cn = ds.getConnection(); v9E+(4I9_
多用于jsp中 $ yDW.pt
2、执行sql语句 |.b%rVu
1)用Statement来执行sql语句 rDIhpT)a
String sql; E\R raPkQT
Statement sm = cn.createStatement(); Z!wD~C"D73
sm.executeQuery(sql); // 执行数据查询语句(select) <#xrrRhm}
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); R=\v3m
2)用PreparedStatement来执行sql语句 ]`zjRRd
String sql; b
A)b`1lI
sql = "insert into user (id,name) values (?,?)"; >.J'L5
x$
PreparedStatement ps = cn.prepareStatement(sql); W[R]^2QAG
ps.setInt(1,xxx); CgVh\4,a
ps.setString(2,xxx); <\, &:<
... UvPp~N7,
ResultSet rs = ps.executeQuery(); // 查询 gf0PMc3l
int c = ps.executeUpdate(); // 更新 /:#j?c
:v#k&Uh3y
3、处理执行结果 W
*YW6
查询语句,返回记录集ResultSet j6n2dMRvSE
更新语句,返回数字,表示该更新影响的记录数 EvwbhvA(
ResultSet的方法 0=OD?48<
1、next(),将游标往后移动一行,如果成功返回true;否则返回false E x_L!9>!
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 4id3P{aU
i^je.,Bi
4、释放连接 tCWJSi`IJ
cn.close(); <^#P6
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection cwu$TP A>
4-y6MH
可滚动、更新的记录集 RI(=HzB
1、创建可滚动、更新的Statement 7^B3lC)
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); X$BXT
该Statement取得的ResultSet就是可滚动的 `Uzs+k-]
2、创建PreparedStatement时指定参数 rW:iBq
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); U:qF/%w
ResultSet.absolute(9000); ?N4A9W9
批量更新 ]dd[WHA
1、Statement .=Pm>o/,
Statement sm = cn.createStatement(); UUl*f!&
o
sm.addBatch(sql1); d4ic9u*D
sm.addBatch(sql2); (JevHdI*V
... +->\79<#V(
sm.executeBatch() Dp!;7e s|
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 yrO?Np
2、PreparedStatement Jf_]Z
PreparedStatement ps = cn.preparedStatement(sql); c`-YIz)W
{ pAENXC\,
ps.setXXX(1,xxx); mH'\:oN
... =fo4x|{O
ps.addBatch(); f4R1$(<
} /ca(a\@R
ps.executeBatch(); h=hoV5d@
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 DeA @0HOxh
}g}6qCv7
事务的处理 a
]>V ZOet
1、关闭Connection的自动提交 >/b^fAG
cn.setAutoCommit(false); <E"*)Oi
2、执行一系列sql语句 lNHNL
a>W
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close yHl@_rN
sC
Statement sm ; j\!
e9M
sm = cn.createStatement(insert into user...); f](I.lm:
sm.executeUpdate(); !0b%Jh
sm.close(); ?4:rP@
sm = cn.createStatement("insert into corp...); O-Dc[t%
sm.executeUpdate(); otU@X 3<_
sm.close(); _]P
a>8X*
3、提交 _=uviMuE
cn.commit(); VR"8Di&)
4、如果发生异常,那么回滚 MM7"a?y)
cn.rollback();