java 数据库基本操作 E0HE@pqr
1、java数据库操作基本流程 R$IsP,Uw
2、几个常用的重要技巧: e\aW~zs 2
可滚动、更新的记录集 ;B2kot7
批量更新 rFt+Y})
事务处理 gkTwGI+w
-;6uN\gq
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 [V8^}s}tF
1、取得数据库连接 ^; U}HAY
1)用DriverManager取数据库连接 )#4(4
@R h
例子 v5 p`=Z@%
String className,url,uid,pwd; N0$
uB"
className = "oracle.jdbc.driver.OracleDriver"; z*b|N45O
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; wZCboQ,
uid = "system"; ;[Xf@xf
pwd = "manager"; 9X1vL
Class.forName(className); GHLFn~z@XJ
Connection cn = DriverManager.getConnection(url,uid,pwd); BuAzO>=
2)用jndi(java的命名和目录服务)方式 "p+oi@
例子 iM9k!u FE
String jndi = "jdbc/db"; <
fe.
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); T^+K`U
DataSource ds = (DataSource) ctx.lookup(jndi); >e.vUUQ{
Connection cn = ds.getConnection(); U+ Yu_=o{
多用于jsp中 6
3PV R"
2、执行sql语句 ;InMgo,
1)用Statement来执行sql语句 FB,rQ9D
String sql; s/>0gu]A8
Statement sm = cn.createStatement(); ./DlHS;
sm.executeQuery(sql); // 执行数据查询语句(select) 6W]C`
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); v^t oe
2)用PreparedStatement来执行sql语句 RxV
" ,
String sql; w .M
sql = "insert into user (id,name) values (?,?)"; dci,[TEGu
PreparedStatement ps = cn.prepareStatement(sql); hWn-[w/l_
ps.setInt(1,xxx); =<#++;!I
ps.setString(2,xxx); S}Z@g
... 6v}q @z
ResultSet rs = ps.executeQuery(); // 查询 41.xi9V2
int c = ps.executeUpdate(); // 更新 X?u=R)uG
Je^;[^
3、处理执行结果 is%ef
查询语句,返回记录集ResultSet wUg=jnY
更新语句,返回数字,表示该更新影响的记录数 i8cmT+}>
ResultSet的方法 'tQp&pj
1、next(),将游标往后移动一行,如果成功返回true;否则返回false e<A>??h^
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 N48X[Q*
ox.kL
4、释放连接 K'E)?NW69
cn.close(); EN}4-P/5
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection G:|]w,^i
>x~Qa@s;
可滚动、更新的记录集 0&kmP '
1、创建可滚动、更新的Statement /{[tU-}qJ
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); aAd1[?&
该Statement取得的ResultSet就是可滚动的 m>w{vqPwJ
2、创建PreparedStatement时指定参数 Gf~^Xv!T
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 3T 0'zJ2f
ResultSet.absolute(9000); =kOo(
批量更新 Mxd7X<\$
1、Statement Z;R/!Py.
Statement sm = cn.createStatement(); 0Nk!.gY
sm.addBatch(sql1); !-SI &qy
sm.addBatch(sql2); ?caHS2%?ae
... _x$Eq:
i
sm.executeBatch() UpQda`rb
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 cV`NQt <W
2、PreparedStatement v$;URF%^
PreparedStatement ps = cn.preparedStatement(sql); ,k@iNid
{
"ZNy*.G|[
ps.setXXX(1,xxx); ?<
Ma4yl</
... |Zo36@s
ps.addBatch(); LZ(K{+U/
} 'c/8|9jX
ps.executeBatch(); M3d%$q)<rW
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 x
FvKjO)
j@UE#I|h
事务的处理 Hy'EbQ
1、关闭Connection的自动提交 w:1UwgcPC
cn.setAutoCommit(false); JnQ@uZb`
2、执行一系列sql语句 \x\(36\u
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close @,G\`;Ma
Statement sm ; LH@Kn?R6
sm = cn.createStatement(insert into user...); 2>CR]
sm.executeUpdate(); AS4oz:B
sm.close(); )T
slI
sm = cn.createStatement("insert into corp...); v`qXb$YW
sm.executeUpdate(); 9*!*n ~
sm.close(); 5lwMc0{/3
3、提交
,HNk<W
cn.commit(); "r@G V5ED
4、如果发生异常,那么回滚 $RC)e7
cn.rollback();