java 数据库基本操作 >vF=}1_L
1、java数据库操作基本流程 /~Zxx}<;
2、几个常用的重要技巧: bX23F?
可滚动、更新的记录集 \#Ez["mD
批量更新 sS7r)HV&GI
事务处理 ]{;=<t6
?{ns1nW:
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 I'%vN^e^
1、取得数据库连接
qc;9{$?xV
1)用DriverManager取数据库连接 tQ=M=BPZ
例子 rf?Q# KM\W
String className,url,uid,pwd; t&MJSFkiA
className = "oracle.jdbc.driver.OracleDriver"; jr29+>
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; /"Ws3.p
uid = "system"; #Y6'Q8gf
pwd = "manager"; #0V$KC*>
Class.forName(className); cPZD#";f
Connection cn = DriverManager.getConnection(url,uid,pwd); Rrmk\7/
2)用jndi(java的命名和目录服务)方式 :yO.Te
F
例子 u^&2T(xGi
String jndi = "jdbc/db"; P]hS0,sE<(
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 1$vsw
DataSource ds = (DataSource) ctx.lookup(jndi); dP}=cZ~
Connection cn = ds.getConnection(); KAH9?zI)M
多用于jsp中 Op%}.9 ed
2、执行sql语句 H*BzwbM?
1)用Statement来执行sql语句 8DHohhN
String sql; AC:cV='
Statement sm = cn.createStatement(); !l-^JPb
sm.executeQuery(sql); // 执行数据查询语句(select) T>,3V:X
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); s_xWvx8?4.
2)用PreparedStatement来执行sql语句 _PUgK\
String sql; 8:E)GhX
sql = "insert into user (id,name) values (?,?)"; .cJWYMC
PreparedStatement ps = cn.prepareStatement(sql); jp?;8rS3
ps.setInt(1,xxx); *<Yn
ps.setString(2,xxx); 'S]7:/CI
... mv_N ns
ResultSet rs = ps.executeQuery(); // 查询 ,*ZdMw!
int c = ps.executeUpdate(); // 更新 Q[+&n*
<J" 7ufHSQ
3、处理执行结果 OW!cydA-
查询语句,返回记录集ResultSet SUwSZ@l^|
更新语句,返回数字,表示该更新影响的记录数 (:v|(Gn/
ResultSet的方法 GZXBzZ}
1、next(),将游标往后移动一行,如果成功返回true;否则返回false BBnW0vAZ*
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 =g|e-XC
zG)XB*c
4、释放连接 j}}:&>;
cn.close(); *[K\_F?^h
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Ct2m l
8G@I e
可滚动、更新的记录集 ?\[2Po]n
1、创建可滚动、更新的Statement O/b~TVA
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); g$+u;ER5
该Statement取得的ResultSet就是可滚动的 A<-Prvryt
2、创建PreparedStatement时指定参数 +iKs)s_~
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); r;m_@*]
ResultSet.absolute(9000); xDv5'IGBb
批量更新
x|C[yu^c
1、Statement baJ(Iy$XT
Statement sm = cn.createStatement(); T;!7GW4E
?
sm.addBatch(sql1); tg%s#lLeH
sm.addBatch(sql2); >;a_i>[
... a![x^@nF
sm.executeBatch() =xzDpn>f
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 d67Q@')00
2、PreparedStatement ]XX9.Xh=-
PreparedStatement ps = cn.preparedStatement(sql); oj\av~cI
{ ti6\~SY
ps.setXXX(1,xxx); v[4A_WjT
... e`gOc*
ps.addBatch(); |Yq0zc!
} fT9z 4[M
ps.executeBatch(); uLFnuK
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 rz/^_dV
=fk+"!-i%"
事务的处理 %@JNX}Y'
1、关闭Connection的自动提交 +|6
'7Z(9
cn.setAutoCommit(false); F-K=Otj
2、执行一系列sql语句 ;:(kVdb
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close my+y<C-o`
Statement sm ; fT)u`voE,
sm = cn.createStatement(insert into user...); Bc1[^{`bq^
sm.executeUpdate(); i$MYR @
sm.close(); \GA6;6%Oo
sm = cn.createStatement("insert into corp...); 15PFnk6E|
sm.executeUpdate(); JBX#U@k>I
sm.close(); {|)u).n|
3、提交 }py6H[
cn.commit(); [X>\!mt
4、如果发生异常,那么回滚 $@]tTz;b
cn.rollback();