java 数据库基本操作 fKQq]&~
H
1、java数据库操作基本流程 KOYcT'J@vR
2、几个常用的重要技巧: mZ!1Vh
可滚动、更新的记录集
M_ii
批量更新 `44 }kkBT
事务处理 ` Clh;
5fuB((fd(
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 |x$2-RUP
1、取得数据库连接 6ntduXeNVh
1)用DriverManager取数据库连接 ]zUvs6ksLG
例子 TBr@F|RXiO
String className,url,uid,pwd; d"~-D;
className = "oracle.jdbc.driver.OracleDriver"; kY.3x#w
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; *c{X\!YBh
uid = "system"; #*)X+*
pwd = "manager"; %D
$+Z(
Class.forName(className); %[J|n~8_Z
Connection cn = DriverManager.getConnection(url,uid,pwd); ?o883!&v
2)用jndi(java的命名和目录服务)方式 vC|V8ea
例子 us$=)m~v+
String jndi = "jdbc/db"; ['#3GJz-
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); )DwHLaLW
DataSource ds = (DataSource) ctx.lookup(jndi); @yxF/eeEy+
Connection cn = ds.getConnection(); /^^wHW:
多用于jsp中 R8n/QCeY{
2、执行sql语句 JR^#NefJ
1)用Statement来执行sql语句 N2/t
String sql; Unc_e
Statement sm = cn.createStatement(); `p\@b~GM
sm.executeQuery(sql); // 执行数据查询语句(select) LqcHsUFj
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Di>B:=
2)用PreparedStatement来执行sql语句 /+g)J0u
String sql; Lcow2 SbH
sql = "insert into user (id,name) values (?,?)"; BELxaV,
PreparedStatement ps = cn.prepareStatement(sql); y~-dQ7r
ps.setInt(1,xxx); r.#"he_6!.
ps.setString(2,xxx); *r|)@K|
... C)v*L#{%
ResultSet rs = ps.executeQuery(); // 查询 HHXm
4}!;<
int c = ps.executeUpdate(); // 更新 MzX4/*ba
lN,)T%[0-
3、处理执行结果 Y>i5ubR~
查询语句,返回记录集ResultSet b@?pofZ`k
更新语句,返回数字,表示该更新影响的记录数 R\^XF8n6/
ResultSet的方法 ml\2%07
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ,,o5hD0V9
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 3Sh#7"K3
aZBb@~Y
4、释放连接 4b<>gpQ
cn.close(); o|O|e9m(
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection f zsD
'BmLR{[2L
可滚动、更新的记录集 [rf.&
1、创建可滚动、更新的Statement .^aqzA=]
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); u{d\3-]/
该Statement取得的ResultSet就是可滚动的 W &HF*Aw
2、创建PreparedStatement时指定参数 T]0H&Oov
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); qG?svt
ResultSet.absolute(9000); F!pgec%]'
批量更新 v>oWk:iJP
1、Statement F* h\ #?
Statement sm = cn.createStatement(); 7,:$, bL
sm.addBatch(sql1); 9Atnnx]n
sm.addBatch(sql2); NR|t~C+
... O=2SDuBZ
sm.executeBatch() l
%M0^d6M
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 h.WvPZ2U
2、PreparedStatement Ka|,
qkb
PreparedStatement ps = cn.preparedStatement(sql); q{E44
eQ7F
{ &|&tPD/dJ
ps.setXXX(1,xxx); w/UZ6fu
... J_ y+.p-
5
ps.addBatch(); nBo?r}t4
} # @~HpqqR
ps.executeBatch(); qr|v|Ejd~
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 @kmOz(
KCc7u8
事务的处理 @M_p3[c\
1、关闭Connection的自动提交 "CcdwWM
cn.setAutoCommit(false); Yp(F}<f?
2、执行一系列sql语句 &/-^D/ot
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 9#iv|X
Statement sm ; ^oYudb^%
sm = cn.createStatement(insert into user...); *%;+3SV
sm.executeUpdate(); RwyRPc_
sm.close(); h-+GS%
sm = cn.createStatement("insert into corp...); ~f5g\n;
sm.executeUpdate(); ^p}|""\j
sm.close(); &w"1VOV<
3、提交 Htn''adg5
cn.commit(); EnD}|9
4、如果发生异常,那么回滚 5i|DJ6
cn.rollback();