java 数据库基本操作 v Mi&0$
1、java数据库操作基本流程 9(CY"Tc3
2、几个常用的重要技巧: m7F"kD
可滚动、更新的记录集 Hl3%+f
批量更新 pI>[^7
事务处理 a@ub%laL
Z
BwpSw\\?@
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 \d,wcL
1、取得数据库连接 4$wn8!x2|
1)用DriverManager取数据库连接 B F,8[|%#
例子 X}W4dpU,
String className,url,uid,pwd; k^Gf2%k
className = "oracle.jdbc.driver.OracleDriver"; *?-,=%,z/
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; p1blPBlp
uid = "system"; ?|`Ba-
pwd = "manager"; )5O E~}>
Class.forName(className); !I8m(axW
Connection cn = DriverManager.getConnection(url,uid,pwd); o-f;$]yp>
2)用jndi(java的命名和目录服务)方式 ;Sq n
w
例子 A0@E^bG
String jndi = "jdbc/db"; Sp2<rI
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); T|L_+(M{
DataSource ds = (DataSource) ctx.lookup(jndi); b":3J)Y6.
Connection cn = ds.getConnection(); w|AHE
多用于jsp中 ]m(C}}
2、执行sql语句 )qL UHE=
1)用Statement来执行sql语句 s[}4Q|s%
String sql; L2jjkyX]
Statement sm = cn.createStatement(); "3r7/>xy
sm.executeQuery(sql); // 执行数据查询语句(select) u5 1%~
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 0|^/ e-^
2)用PreparedStatement来执行sql语句 :Nt_LsH
String sql; .C=I~Z
sql = "insert into user (id,name) values (?,?)"; z^etH/]Sy
PreparedStatement ps = cn.prepareStatement(sql); Bc!ZHW*&
ps.setInt(1,xxx); *2(W`m
ps.setString(2,xxx); 43HZ)3!me
... 'WC>
_L
ResultSet rs = ps.executeQuery(); // 查询 G)S(a4
int c = ps.executeUpdate(); // 更新 %^?yI
D J:N
3、处理执行结果 Jj:Bi&C
查询语句,返回记录集ResultSet @|i
f^
更新语句,返回数字,表示该更新影响的记录数 q"uP%TN
ResultSet的方法 Ol@ssm
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 6iZ:0y0t+6
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ^hN.FIzM
}R\9ybv
4、释放连接 9td[^EB#(h
cn.close(); ' thEZ
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection !idQ-&
"+@>!U
可滚动、更新的记录集 K@0/iWm*
1、创建可滚动、更新的Statement pT;{05
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); $X;wj5oj
该Statement取得的ResultSet就是可滚动的 1vG]-T3VC
2、创建PreparedStatement时指定参数 5Y W.s
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); )dMXn2O
ResultSet.absolute(9000); 9_07?`Jr
批量更新 [/Figr]
1、Statement Onqd2'%<
Statement sm = cn.createStatement(); &AS<2hB
sm.addBatch(sql1); bTrQ(qp
sm.addBatch(sql2); IdzrQP
... `O'@TrI
sm.executeBatch() v)VhR2d3
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 }Efz+>F02
2、PreparedStatement j_I
PreparedStatement ps = cn.preparedStatement(sql); aglW\LT^
{ M10u?
ps.setXXX(1,xxx); / >As9|%
... Bp.z6x4
ps.addBatch(); NETji:d
} rP=!!fC1;
ps.executeBatch(); HJh9<I
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 7ql&UIeQ
[HV9KAoA
事务的处理 :q+D`s
1、关闭Connection的自动提交 F9Bj$`#)
cn.setAutoCommit(false); J6s55
v
2、执行一系列sql语句 U_/<tWl\[3
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close sY#iGEf
Statement sm ; qUMM}ls
sm = cn.createStatement(insert into user...); JuD$CHg;#
sm.executeUpdate(); ti)4J2c,8
sm.close(); ~Xf&<&5d T
sm = cn.createStatement("insert into corp...); /JOEnQ5X\!
sm.executeUpdate(); n*
7mP
sm.close(); fV`R7m.
3、提交 }&o*ZY-1
cn.commit(); g3i !>
4、如果发生异常,那么回滚 BwN>;g_
cn.rollback();