java 数据库基本操作 R $&o*K`?
1、java数据库操作基本流程 byTh/ H
2、几个常用的重要技巧: Olh<,p+x
可滚动、更新的记录集 /4g1zrU
批量更新 l y(>8F
事务处理 AS\F{ !O
c
)G3k/T5
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 4WJ.^ (
1、取得数据库连接 cFeXpj?GV
1)用DriverManager取数据库连接
yls
^ cyX
例子 d5oIH
String className,url,uid,pwd; '=Rs/EDME
className = "oracle.jdbc.driver.OracleDriver"; z"0I>gl
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ch0{+g&
uid = "system"; t0IEaj75c
pwd = "manager"; <-[wd.M_
Class.forName(className); pov)Z):}G<
Connection cn = DriverManager.getConnection(url,uid,pwd); gLy&esJl1
2)用jndi(java的命名和目录服务)方式 #wV8X`g
例子 a'2$nbp}
String jndi = "jdbc/db"; B)qWtMZx
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); |h;0H`
DataSource ds = (DataSource) ctx.lookup(jndi); Kac' ;1
Connection cn = ds.getConnection(); ly:q6i
多用于jsp中 n2oz"<?$S
2、执行sql语句 K2J\awX
1)用Statement来执行sql语句 zxC#0@qX07
String sql; tD+9kf2
Statement sm = cn.createStatement(); UazP6^{L
sm.executeQuery(sql); // 执行数据查询语句(select) jV4\A
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); :E:38q,hG
2)用PreparedStatement来执行sql语句 (H
->IV
String sql; C!fMW+C@
sql = "insert into user (id,name) values (?,?)"; BFo5\l:q8
PreparedStatement ps = cn.prepareStatement(sql); LUqB&,a}
ps.setInt(1,xxx); X&7F_#s
ps.setString(2,xxx); 6f\Lf?vF
... 0a}u;gt,4w
ResultSet rs = ps.executeQuery(); // 查询 jpO7'ivG
int c = ps.executeUpdate(); // 更新 {&\jW!&n
=5kY6%E7c
3、处理执行结果 Mz~M3$$9n
查询语句,返回记录集ResultSet Of4^?`
^
更新语句,返回数字,表示该更新影响的记录数 "x 3lQ
ResultSet的方法 Q0&H#xgt
1、next(),将游标往后移动一行,如果成功返回true;否则返回false cVv;Jn
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 p$PKa.Y3
)i!o8YB
4、释放连接 YbTxn="_
cn.close(); H;YP8MoQ
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection U$_xUG
~ xft
可滚动、更新的记录集 >D(R YI
1、创建可滚动、更新的Statement rvnT6Ve
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); xHz[t6;4;
该Statement取得的ResultSet就是可滚动的 joiL{
2、创建PreparedStatement时指定参数 2oNk93D
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); wid;8%m
ResultSet.absolute(9000); e>(<eu~P
批量更新 TWQG591
1、Statement xwJH(_-
Statement sm = cn.createStatement(); :}@g6
sm.addBatch(sql1); E0MGRI"me
sm.addBatch(sql2); Kfh|
... :'~Y
sm.executeBatch() f;1K5Y
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 /.Ww6a~
2、PreparedStatement r[lF<2&*R
PreparedStatement ps = cn.preparedStatement(sql); Y#u}tE
d
{ %<an9WMF
ps.setXXX(1,xxx); *Df,Ijh $
... "a8j"lPJ
ps.addBatch(); r=X}%~_8X
} FRg^c
kb"
ps.executeBatch(); l}]t~!X=
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 5[*
qi?w=
[^U#Qj)hL
事务的处理 eS<lwA_
1、关闭Connection的自动提交 @8;W \L$~1
cn.setAutoCommit(false); /J:bWr
2、执行一系列sql语句 BV>\ McI+
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close .pN`;*7`
Statement sm ; 0},PJ$8x
sm = cn.createStatement(insert into user...); [&&1j@LQ*
sm.executeUpdate(); m0c P (
sm.close(); W!?7D0q
sm = cn.createStatement("insert into corp...); Db;G@#x
sm.executeUpdate(); YRh BRE
sm.close(); Y6Lf@}2(i
3、提交 (fCXxyZrr
cn.commit(); mo[Zb0>
4、如果发生异常,那么回滚
?sMP~RHQ
cn.rollback();