java 数据库基本操作 7lP3\7wD@9
1、java数据库操作基本流程 iC U[X&
2、几个常用的重要技巧: ,p(4OZz5,
可滚动、更新的记录集 sU7>q}!
批量更新 &5*)r@+
事务处理 TF\<`}akX
sOyWsXd+R'
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 5fh@nR
1、取得数据库连接 Z=;+)
#,
1)用DriverManager取数据库连接 |.bp
例子 x.>E7
+
String className,url,uid,pwd; >{DHW1kF?
className = "oracle.jdbc.driver.OracleDriver"; .3;bUJ1
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; @G/':N
uid = "system"; $}[Tj0+:
pwd = "manager"; m7:E73:
Class.forName(className); Salu[)+?
Connection cn = DriverManager.getConnection(url,uid,pwd); %}z/_QZ
2)用jndi(java的命名和目录服务)方式 xP@VK!sc
例子 jgiP2k[Xom
String jndi = "jdbc/db"; v\9:G
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ETu7G5?
DataSource ds = (DataSource) ctx.lookup(jndi); o?G^=0T
Connection cn = ds.getConnection(); +B*8$^,V)
多用于jsp中 cQ4TYr;?
2、执行sql语句 MSEBvZ-
1)用Statement来执行sql语句 ^V^In-[!y:
String sql; =hV-E
D
Statement sm = cn.createStatement(); 0m5Q;|mH
sm.executeQuery(sql); // 执行数据查询语句(select) -25#Vh
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); d6lhA 7
2)用PreparedStatement来执行sql语句 !g? ~<`
String sql; -Q@jL{Ue
sql = "insert into user (id,name) values (?,?)";
]
=Js 5
PreparedStatement ps = cn.prepareStatement(sql); //--r5Q
ps.setInt(1,xxx); {$iJYS\
ps.setString(2,xxx); l+'1>T.I
... k&nhF9Y4
ResultSet rs = ps.executeQuery(); // 查询 o3H+.u$
int c = ps.executeUpdate(); // 更新 Xco$
yF%
qa ![oMKc
3、处理执行结果 =N,KVMxw
查询语句,返回记录集ResultSet ujcS>XN,1
更新语句,返回数字,表示该更新影响的记录数 `92 D]^g
ResultSet的方法 c$f|a$$b
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ixJUq o
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 lY}mrb
;F&wGe
4、释放连接 ^H+j;K{5,
cn.close(); @LY 5]og
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection $,k SR}
O$
i6r]j_
可滚动、更新的记录集 ?`F")y
1、创建可滚动、更新的Statement 6'C!Au
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); #( nheL
该Statement取得的ResultSet就是可滚动的 X$JO<@x
2、创建PreparedStatement时指定参数 d9/E^)TT
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
w'=#7$N
ResultSet.absolute(9000); *D1fSu!
批量更新 JxQwxey{
1、Statement *jWU8.W
Statement sm = cn.createStatement(); <$.KCLP
sm.addBatch(sql1); 4Uz:zB
sm.addBatch(sql2); #e%.z+7I
... hMJ \a
sm.executeBatch() )!dELS\ix
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 FH8?W|
G
2、PreparedStatement _lQ+J=J$.R
PreparedStatement ps = cn.preparedStatement(sql); TJY$<:
{ 98C~%+
ps.setXXX(1,xxx); |D^Q}uT
... ,IUMH]D
ps.addBatch(); k?Jzy
} hvBuQuk)
ps.executeBatch(); ~QdwoeaD
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 m@JU).NKCS
!W:QLOe6F
事务的处理 Rn{q/h
1、关闭Connection的自动提交 v >3ctP{
cn.setAutoCommit(false); rOY^w9!
2、执行一系列sql语句 7>{edNy!,
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close #},]`"n\
Statement sm ; M
O5fu!
sm = cn.createStatement(insert into user...); 7kn=j6I
sm.executeUpdate(); ./<3jf :
sm.close(); F dv&kK!
sm = cn.createStatement("insert into corp...); )I+1 b
!U
sm.executeUpdate(); SU#
S'
sm.close(); if5Y!Tx?G
3、提交 5*buRYck0
cn.commit(); $#4z>~0
4、如果发生异常,那么回滚 [v-?MS
cn.rollback();