java 数据库基本操作 Lf((
zk:pt
1、java数据库操作基本流程 u"&?u+1j
2、几个常用的重要技巧: v#x`c_
可滚动、更新的记录集 x|m9?[
!_
批量更新 X$5
事务处理 [2-n*a(q
>e {1e
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 c:m=9>3
1、取得数据库连接 E!ndXz 59
1)用DriverManager取数据库连接 !'H$08Ql}
例子 l_}d Q&R
String className,url,uid,pwd; u9~5U9]O%6
className = "oracle.jdbc.driver.OracleDriver"; 'Ou C[$Z
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ;mEn@@{
uid = "system"; Dnd; N/9
pwd = "manager"; 8)>x) T
Class.forName(className); wPM&N@Pf
Connection cn = DriverManager.getConnection(url,uid,pwd); P7F"#R0QB
2)用jndi(java的命名和目录服务)方式 u{DEOhtI4
例子 opa}z-7>^
String jndi = "jdbc/db";
U${W3Ra
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); |OJWQU![by
DataSource ds = (DataSource) ctx.lookup(jndi); b=r 3WkB6
Connection cn = ds.getConnection(); To(I<W|{
多用于jsp中 n1PptR
2、执行sql语句 %_W4\
1)用Statement来执行sql语句 k7iko{5D
String sql; 4fsd5#
Statement sm = cn.createStatement(); \Wfw\x0.
sm.executeQuery(sql); // 执行数据查询语句(select) I4"p]>Y"
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); o=R(DK# U
2)用PreparedStatement来执行sql语句 ?5EH/yV;
String sql; >g<YH'U{
sql = "insert into user (id,name) values (?,?)"; }T4|Kyu?
PreparedStatement ps = cn.prepareStatement(sql); s21}
a,eB
ps.setInt(1,xxx); ol"|?*3q
ps.setString(2,xxx); ?C[?dg{n
... O?X[&t
ResultSet rs = ps.executeQuery(); // 查询 f7a4E+}
int c = ps.executeUpdate(); // 更新 Ip'tB4Mq
jn5xYKv
3、处理执行结果 i#V(oSx
查询语句,返回记录集ResultSet \I!mzo
更新语句,返回数字,表示该更新影响的记录数 tfU*U>j
ResultSet的方法 lBbb7*Ljt<
1、next(),将游标往后移动一行,如果成功返回true;否则返回false H<Sf0>OA
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 >SI'Q7k
B)Y[~4o
4、释放连接 F(hPF6Zx(
cn.close(); :$"{-n
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection elR'e6Q
S[K5ofV
可滚动、更新的记录集 w5 . ^meU
1、创建可滚动、更新的Statement 4SI~y;c)
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); <}J!_$A
该Statement取得的ResultSet就是可滚动的 c;kU|_
2、创建PreparedStatement时指定参数 C{bxPILw
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); (S!UnBb&
ResultSet.absolute(9000); KdCrI@^
批量更新 s-IE}I?;
1、Statement w||t3!M+n
Statement sm = cn.createStatement(); *|=D 0
sm.addBatch(sql1); !Axe}RD'
sm.addBatch(sql2); tQ9%rb
... 4"2%mx:
sm.executeBatch() )5b_>Uy
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 t,9+G<)>H
2、PreparedStatement v8-My1toV
PreparedStatement ps = cn.preparedStatement(sql); y[XD=j
{ %k#+nad
ps.setXXX(1,xxx); h*VDd3[#
... ~5HT_B U=
ps.addBatch(); zjUQ]
} fo,0NxF9
ps.executeBatch(); 5b:1+5iF-
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ^^v3iCT
5}G_2<G
事务的处理 Dd1k?
1、关闭Connection的自动提交 Yd3lL:M
cn.setAutoCommit(false); o:#jvi84F
2、执行一系列sql语句 t5E$u(&+'B
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close &MpLm&
Statement sm ; k)3N0]q6
sm = cn.createStatement(insert into user...); c
\??kQH
sm.executeUpdate(); 9YI@c_1 Q
sm.close(); $}(Z]z}O ;
sm = cn.createStatement("insert into corp...); t#.}0Te7
sm.executeUpdate(); C)U4Fr ?E:
sm.close(); ahXcQ9jzFi
3、提交 *R+M#l9D`
cn.commit(); ug]2wftlQ
4、如果发生异常,那么回滚 #+o$Tg
cn.rollback();