java 数据库基本操作 y)3(
1、java数据库操作基本流程 0XlX7Sk+
2、几个常用的重要技巧: V07x+ovq
可滚动、更新的记录集 inBd.%Yr
批量更新 b("JgE`
事务处理 lwH&4K
=#XsY,r
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 3)f=Z2U>
1、取得数据库连接 XEqg%f
1)用DriverManager取数据库连接 `
n{rzenPX
例子 ,8(%J3J
String className,url,uid,pwd; syh0E=If_
className = "oracle.jdbc.driver.OracleDriver"; z(<
E %
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ^_<>o[qE
uid = "system"; x7e
pwd = "manager"; </y V
Class.forName(className); |Y<ca
Connection cn = DriverManager.getConnection(url,uid,pwd); V>P\yr?
2)用jndi(java的命名和目录服务)方式 tC+9W1o
例子 .Jdw:
String jndi = "jdbc/db"; Fm}O,=
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); K.
G#[
DataSource ds = (DataSource) ctx.lookup(jndi); /3%]Ggwe
Connection cn = ds.getConnection(); *9^CgLF
多用于jsp中 SX}GKu
2、执行sql语句 "sFdrXJ
1)用Statement来执行sql语句 whNRUOK:
String sql; ;J\{r$q
Statement sm = cn.createStatement(); 8O{]ML
sm.executeQuery(sql); // 执行数据查询语句(select) 'D(Hqdr;:
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 7kn=j6I
2)用PreparedStatement来执行sql语句 9BANCW"
String sql; Oe9{`~
sql = "insert into user (id,name) values (?,?)"; nGW
wXySq
PreparedStatement ps = cn.prepareStatement(sql); V`69%35*@
ps.setInt(1,xxx); _|8"&*T^
ps.setString(2,xxx); @6*<Xs
=
... v85&s
ResultSet rs = ps.executeQuery(); // 查询 zi>f436-
int c = ps.executeUpdate(); // 更新 .WL507*"Ce
@
x*#7Y
3、处理执行结果 B4R,[WE"
查询语句,返回记录集ResultSet },a|WL3^
更新语句,返回数字,表示该更新影响的记录数 D .Cm&
ResultSet的方法 !xo@i XL
1、next(),将游标往后移动一行,如果成功返回true;否则返回false U7crbj;c)d
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 %o4d43uZ
N5/TV%u
4、释放连接 l^`!:BOtR
cn.close(); Q,\lS
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection >\DXA)nc
|[34<tIN
可滚动、更新的记录集 6}NvVolr
1、创建可滚动、更新的Statement dc&Qi_W
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); SO p%{b
该Statement取得的ResultSet就是可滚动的
=hl-c
2、创建PreparedStatement时指定参数 ^ioTd
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); g8kw|BgnL
ResultSet.absolute(9000); !.t'3~dUf$
批量更新 5!nZvv
1、Statement wuYo@DDU#
Statement sm = cn.createStatement(); Y_/Kd7,\~
sm.addBatch(sql1); tDN-I5q
sm.addBatch(sql2); 5RLK]=
... F$ h/k^
sm.executeBatch()
jMp{
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 X_!mZ\H7
2、PreparedStatement Jy|Mfl%d
PreparedStatement ps = cn.preparedStatement(sql); ;
wHuL\
{ WZO#(eO`
ps.setXXX(1,xxx); iBUf1v
... aRG[F*BY
ps.addBatch(); }4
$EN
} {iQ<`,)Y
ps.executeBatch(); Y6N+,FAk+J
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 <K\F/`c
8=nm`7(]
事务的处理 )i!)Tv
1、关闭Connection的自动提交 B!tte)
cn.setAutoCommit(false); 4|+
|L_
2、执行一系列sql语句 ;,4J:zvZdQ
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close
Osy5|Ts
Statement sm ; ))KsQJ"V
sm = cn.createStatement(insert into user...); NX=dx&i>+
sm.executeUpdate(); b6/:reH{
sm.close(); moo>~F _^
sm = cn.createStatement("insert into corp...); z:fhq:R(
sm.executeUpdate(); 9MYt4
sm.close(); *(k=!`4(
3、提交 nVM`&azD
cn.commit(); `UJW:qqW
4、如果发生异常,那么回滚 \U-5&,fP
cn.rollback();