java 数据库基本操作 7dtkylW
1、java数据库操作基本流程 )HJ#|JpxC
2、几个常用的重要技巧: &_W~d0
可滚动、更新的记录集 6Us*zKgW
批量更新 UTR`jXCg
事务处理 5><KTya?=
y;xY74Nq
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 n>\2_$uDI
1、取得数据库连接 e]q(fPK
1)用DriverManager取数据库连接 l[u=_uaYl
例子 ]x:>!y
String className,url,uid,pwd; #[ ?E,
className = "oracle.jdbc.driver.OracleDriver"; #d;/Me
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; AOscewQ
uid = "system"; EEdU\9DH(
pwd = "manager"; iTIYq0u|#R
Class.forName(className); Zj5B}[,l\
Connection cn = DriverManager.getConnection(url,uid,pwd); s5
($b
2)用jndi(java的命名和目录服务)方式 ^g
N/ 5
例子 ViYfK7Z
String jndi = "jdbc/db"; Q7 @oAeNd
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); :hFKmoy#
DataSource ds = (DataSource) ctx.lookup(jndi); KuJNKuHa.
Connection cn = ds.getConnection(); %=`wN^3t2
多用于jsp中 _(:<l
YaY
2、执行sql语句 Wf:LYL
1)用Statement来执行sql语句 v$~$_K
String sql; nN5fP<H2x
Statement sm = cn.createStatement(); ,Vfjt=6]}
sm.executeQuery(sql); // 执行数据查询语句(select) kcG_ n
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); P^[y~I#{
2)用PreparedStatement来执行sql语句 b!oj3|9
String sql; 4~i?xo=;v
sql = "insert into user (id,name) values (?,?)"; -OXC;y
PreparedStatement ps = cn.prepareStatement(sql); Znd ,FqHk
ps.setInt(1,xxx); `lA_knS
ps.setString(2,xxx); i!;9A6D
... (z 9M
ResultSet rs = ps.executeQuery(); // 查询 bCqTubbx!t
int c = ps.executeUpdate(); // 更新 SFR<T
=z[$o9
3、处理执行结果 %ty`Oa2
查询语句,返回记录集ResultSet JA~q}C7A7o
更新语句,返回数字,表示该更新影响的记录数 6{!Cx9V
ResultSet的方法 $:RR1.Tv
1、next(),将游标往后移动一行,如果成功返回true;否则返回false M;9s
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Zm*q V!
@Yn+ir0>O
4、释放连接 K5!OvqzG
cn.close(); L%jIU<?Z7
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection xVk5%
+w/B3b
可滚动、更新的记录集 uHq;z{ 2GI
1、创建可滚动、更新的Statement fcO|0cQ
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 28qlp>U
该Statement取得的ResultSet就是可滚动的 >t{-_4Yv?
2、创建PreparedStatement时指定参数 //'&a-%$^
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ohjl*dw
ResultSet.absolute(9000); Qk >9o
批量更新 :b]
\*
1、Statement u+^KP>rM(
Statement sm = cn.createStatement(); ?dPr HSy
sm.addBatch(sql1); 3Ak'Ue
sm.addBatch(sql2); #p
;O3E@
... ST2:&xH(
sm.executeBatch() (&Rql7](8
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 /_qHF-
2、PreparedStatement "
sC]z}
PreparedStatement ps = cn.preparedStatement(sql); rp+]f\]h
{ @lWYc`>}
ps.setXXX(1,xxx); *d`KD64
... QQHQ3\
ps.addBatch(); 1tLEKSo+
} AGm=0Om
ps.executeBatch(); \d*ts(/a*
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 IEfYg(c0U
]&N>F8.L+
事务的处理 w3z'ZCcr;"
1、关闭Connection的自动提交 \B^NdG5Y
cn.setAutoCommit(false); ,,!P-kK$
2、执行一系列sql语句 #uF`|M$u
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close RL$%Vy0
Statement sm ; vZW[y5
sm = cn.createStatement(insert into user...); 8Ihl}aguW
sm.executeUpdate(); ,`02fMOLc
sm.close(); &_u.q/~
sm = cn.createStatement("insert into corp...); e`:^7$
sm.executeUpdate(); I)yF!E &
sm.close(); "}wO<O6[
3、提交 MB7*AA;
cn.commit(); wZN_YFwQ
4、如果发生异常,那么回滚 CmV &+C$V%
cn.rollback();