java 数据库基本操作 ZWp(GC1NA
1、java数据库操作基本流程 Nu~lsWyRI5
2、几个常用的重要技巧: T37XBg H
可滚动、更新的记录集 %BB%pC
批量更新 TrR8?-
事务处理 w917N4$
|)/aGZ+
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 sds"%]rg
1、取得数据库连接 QoH6
1)用DriverManager取数据库连接 t#eTV@-
例子 !m?-!:
String className,url,uid,pwd; d9|<@A
className = "oracle.jdbc.driver.OracleDriver"; 3|Xyl`i4o
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; tcog'nAz
uid = "system"; }?v )N).kW
pwd = "manager"; )IZ~G\Ra'
Class.forName(className); }|5Pr(I
Connection cn = DriverManager.getConnection(url,uid,pwd); Fh9h,'
V"
2)用jndi(java的命名和目录服务)方式 4#hSJ(~7S
例子 gt w Q-
String jndi = "jdbc/db"; )B8$<sv
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); r^ ZEImjc
DataSource ds = (DataSource) ctx.lookup(jndi); lBGQEP3;
Connection cn = ds.getConnection(); .y:U&Rw4
多用于jsp中 mBON$sF|
2、执行sql语句 b<gr@ WF
1)用Statement来执行sql语句 >!)DM]Ri
String sql; Jma1N;d
Statement sm = cn.createStatement(); P\)iZiGc
sm.executeQuery(sql); // 执行数据查询语句(select) l_%6
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); g_COp"!~9
2)用PreparedStatement来执行sql语句 <dhM\^[
String sql; c6]D-YNFG
sql = "insert into user (id,name) values (?,?)"; hpL;bM'
PreparedStatement ps = cn.prepareStatement(sql); ZLAy-
9^Y
ps.setInt(1,xxx); R@k&SlL'`
ps.setString(2,xxx); "kgdbAZ
... [QT#Yf0
ResultSet rs = ps.executeQuery(); // 查询 TBU&6M>{3
int c = ps.executeUpdate(); // 更新 I`4*+a'q&
L4y4RG/SJ:
3、处理执行结果 y9}>: pj4
查询语句,返回记录集ResultSet $l&(%\pp
更新语句,返回数字,表示该更新影响的记录数 8 uwq-/$
ResultSet的方法 n^6j9FQ7
1、next(),将游标往后移动一行,如果成功返回true;否则返回false N^:9Fz
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 %&t<K3&Yh
,7K`[
4、释放连接 (qulwOt~w
cn.close(); sYf~c0${
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection O]1(FWYy
tT?cBg{
可滚动、更新的记录集 vn"{I&L+w0
1、创建可滚动、更新的Statement !ff&W1@
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); $(>+VH`l
该Statement取得的ResultSet就是可滚动的 RF0HjgP
2、创建PreparedStatement时指定参数 ,',o'2=!
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); #],&>n7'
ResultSet.absolute(9000); 1Nd2{(
批量更新 7g}w+p>
1、Statement gQ1;],_
Statement sm = cn.createStatement(); 3HY9\'t6
sm.addBatch(sql1); O55 xS+3^k
sm.addBatch(sql2); !5uGd`^I
... i9][N5\$
sm.executeBatch() t"/q]G5
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 l$bu%SZ
2、PreparedStatement #';:2Nyq
PreparedStatement ps = cn.preparedStatement(sql); K?$^@N
{ ** G9H
ps.setXXX(1,xxx); {8,J@9NU
... hv_XP,1K
ps.addBatch(); aM0f/"-_
} +@iA;2&
ps.executeBatch(); /HRFAqep
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。
n$,*|_$#
E#t>Qn
事务的处理 naznayy
1、关闭Connection的自动提交 .$)
cn.setAutoCommit(false); 2Ny"O.0h
2、执行一系列sql语句 ,>+p-M8ZL
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close WKa~[j|-K
Statement sm ; R/>@+
sm = cn.createStatement(insert into user...); PxkOT*
sm.executeUpdate(); GD_hhDyD
sm.close(); 2{G:=U
sm = cn.createStatement("insert into corp...); 2n"V}p>8i#
sm.executeUpdate(); |T)6yDL
sm.close(); +l{=
3、提交 t"'7m^j
cn.commit(); i3'9>"`
4、如果发生异常,那么回滚 T\>a!
cn.rollback();