java 数据库基本操作 F RS@-P
1、java数据库操作基本流程 P0}uTee
2、几个常用的重要技巧: %+>I1G
可滚动、更新的记录集 9~Q.[ A
批量更新 k3^S^Bv\
事务处理 *Fp )/Ih
tGv4 S\
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 U%w?muJW
1、取得数据库连接 J=zh+oLCV
1)用DriverManager取数据库连接 > YN<~z-
例子 dwB-WF%k
String className,url,uid,pwd; V"T;3@N/4
className = "oracle.jdbc.driver.OracleDriver"; V..m2nQj
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ^J@Y?CQl\
uid = "system"; wR>\5z)^
pwd = "manager"; b`18y cVME
Class.forName(className); HO&#Lv
Connection cn = DriverManager.getConnection(url,uid,pwd); B5J=q("P
2)用jndi(java的命名和目录服务)方式 Ler9~}\D
例子 sE-"TNONZ
String jndi = "jdbc/db";
7&l
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 0Oe@0L%^3"
DataSource ds = (DataSource) ctx.lookup(jndi); Z</$~
T
Connection cn = ds.getConnection();
]UFf-
多用于jsp中 4*F+-fu
2、执行sql语句 \u",bMQF
1)用Statement来执行sql语句 IjJ3CJ<
String sql; <@@.~Qm'
Statement sm = cn.createStatement(); 83)2c a
sm.executeQuery(sql); // 执行数据查询语句(select) w9c
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); a2o+tR;H
2)用PreparedStatement来执行sql语句 2Hy $SSH
String sql; z`f1|Ok
sql = "insert into user (id,name) values (?,?)"; txTDuS
PreparedStatement ps = cn.prepareStatement(sql); 9dSKlB5J
ps.setInt(1,xxx); +}X@{DB
ps.setString(2,xxx); 2l8jw:=H
... M)Ogb'@#
ResultSet rs = ps.executeQuery(); // 查询 ,#D&*
int c = ps.executeUpdate(); // 更新 d}ue/hdw
^om(6JL2
3、处理执行结果 s.Yyw y
查询语句,返回记录集ResultSet .i@e6JE~;
更新语句,返回数字,表示该更新影响的记录数 U,aV{qz
ResultSet的方法 ^ 8egn|
1、next(),将游标往后移动一行,如果成功返回true;否则返回false au0)yg*V1
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 >qAQNX
v=9:N/sW
4、释放连接 ,%>/8*
cn.close(); $+:_>n^#/
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection FW=oP>f]w
.* VZY
可滚动、更新的记录集 .P-@ !Q5*
1、创建可滚动、更新的Statement *.W![%Be
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); sq&$
该Statement取得的ResultSet就是可滚动的 7lf*
v qG
2、创建PreparedStatement时指定参数 b~%(5r.
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 8(5}Jo+
ResultSet.absolute(9000); >`8i=ZpCOS
批量更新 $6BXoh!
1、Statement U1J?o#(
Statement sm = cn.createStatement(); ks:Z=%o
sm.addBatch(sql1); vKol@7%N
sm.addBatch(sql2); a&wl-
... n uhKM.a{
sm.executeBatch() &kYg
>X
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 #RZW)Br
2、PreparedStatement ),dXaP[
PreparedStatement ps = cn.preparedStatement(sql); R279=sO,J
{ d,+d8X
ps.setXXX(1,xxx); W[w8@OCNf
... 5A:b
\
ps.addBatch(); 1r|'n aiZ
} oT%~)g
ps.executeBatch(); F0+ u#/#
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ]"{K5s7
DHgEhf]
事务的处理 qZCA16
1、关闭Connection的自动提交 ?uOdqMJV
cn.setAutoCommit(false); f!0* ^d
2、执行一系列sql语句 E3;[*ve
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close wM_k D
Statement sm ; l#V"14y
sm = cn.createStatement(insert into user...); ~48Uch\LG:
sm.executeUpdate(); |f?tyQ
sm.close(); -~]*)&
sm = cn.createStatement("insert into corp...); J=|fxR
sm.executeUpdate(); Da)9s %_4
sm.close(); &37QUdp+p
3、提交 cZ%weQa#N)
cn.commit(); *d?,i-Q.+
4、如果发生异常,那么回滚 j01#Wq_\fk
cn.rollback();