java 数据库基本操作 kV ,G,wo
1、java数据库操作基本流程 mhk/>+hF
2、几个常用的重要技巧: 3fxNV<
可滚动、更新的记录集 cVay=5].
批量更新 o}=.
事务处理 ?Hi}nsw
u:k:C
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Mjj}E
>&
1、取得数据库连接 y-#
1)用DriverManager取数据库连接 "XNu-_$N<a
例子 =#(0)p$EC
String className,url,uid,pwd; i7nL_N
className = "oracle.jdbc.driver.OracleDriver"; Px?Ao0)Z,
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 'qV3O+@MF
uid = "system"; HmExfW
pwd = "manager"; &|N%#pYS
Class.forName(className); vWl[l
-E
Connection cn = DriverManager.getConnection(url,uid,pwd); 0zbLc%
2)用jndi(java的命名和目录服务)方式 }t|Plz
例子 7%9)C[6NSs
String jndi = "jdbc/db"; Ud#X@xK<h
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); T^$g N|
DataSource ds = (DataSource) ctx.lookup(jndi); <jUrE[x
Connection cn = ds.getConnection(); >`89N'lZBm
多用于jsp中 %l}Q?Z
2、执行sql语句 0)AM-/"
1)用Statement来执行sql语句 #%^\\|'z
String sql; =4zNo3IvL+
Statement sm = cn.createStatement(); vJRnBq+y
sm.executeQuery(sql); // 执行数据查询语句(select) ] *-;' *
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); mP pvZ
2)用PreparedStatement来执行sql语句 Kej|1g1f
String sql; Y}LLOj@L
sql = "insert into user (id,name) values (?,?)"; tqf&N0*
PreparedStatement ps = cn.prepareStatement(sql); :p<kQ4
ps.setInt(1,xxx); BR36}iS;V
ps.setString(2,xxx); 2QGMe}
... *KK[(o}^J-
ResultSet rs = ps.executeQuery(); // 查询 / Mod=/e
int c = ps.executeUpdate(); // 更新 yGvDn' m
Dz`k[mI
3、处理执行结果 qO-C%p
[5
查询语句,返回记录集ResultSet 94|yvh.B
更新语句,返回数字,表示该更新影响的记录数 PK6*}y
ResultSet的方法 ZBX
1、next(),将游标往后移动一行,如果成功返回true;否则返回false '@TI48 J+
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 9?;@*x
Y{Da+
4、释放连接 e&QS#k
cn.close(); z2w;oM$g
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 'y9*uT~
\sK:W|yy
可滚动、更新的记录集 wE$s'e
1、创建可滚动、更新的Statement U:]MgZWn
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); F7{R~mS;
该Statement取得的ResultSet就是可滚动的 c>ad0xce6
2、创建PreparedStatement时指定参数 |2)Sd[q
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); dEASvD'
ResultSet.absolute(9000); lC#RNjDp/~
批量更新 TDlZ!$g(
1、Statement 3J%V%}mD
Statement sm = cn.createStatement(); q2e]3{l3
sm.addBatch(sql1); ljPq2v ]
sm.addBatch(sql2); 6&89~W{
... _>Pk8~m
sm.executeBatch() iJdP>x
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 H9RGU~q4s[
2、PreparedStatement 3Y
z]8`C
PreparedStatement ps = cn.preparedStatement(sql); 5W+{U8\
{ :l+_ja&o
ps.setXXX(1,xxx); z% V* K
... 4\M8BRuE
ps.addBatch(); }[ ].\G\G
} eZg$AOpU
ps.executeBatch(); EeCFII
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 iTh
xVD
H]s4% 9T
事务的处理 #?9Q{0e
1、关闭Connection的自动提交 <uZPqi||
cn.setAutoCommit(false); !@u&{"{`
2、执行一系列sql语句 a3q\<"|
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close (ZV;$N-t
Statement sm ; x>%joKY[
sm = cn.createStatement(insert into user...); %>Bko,ET
sm.executeUpdate(); @(-yrU
sm.close(); +?;j&p
sm = cn.createStatement("insert into corp...); pOMgEEhfS
sm.executeUpdate(); x;u ~NKy
sm.close(); 4O!E|/`wO
3、提交 Xo Y7/&&
cn.commit(); @,k7xm$u
4、如果发生异常,那么回滚 s~^*+kq
cn.rollback();