java 数据库基本操作 w#W5}i&x
1、java数据库操作基本流程 %rFP#L
2、几个常用的重要技巧: |__d 8a
可滚动、更新的记录集 OMl8 a B9
批量更新 %(fL?
事务处理 |d5ggf.w
Q%rVo4M#2
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Q?Wr7
1、取得数据库连接 ,Yo: &>As
1)用DriverManager取数据库连接 t9ER;.e
例子 >Ja0hS{*
String className,url,uid,pwd; ggMUdlU
className = "oracle.jdbc.driver.OracleDriver"; 3)dP7rmZ
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; sc<kiL
uid = "system"; A8J?A#R*{q
pwd = "manager"; `$H7KI G
Class.forName(className); Xu6jHJ@ x
Connection cn = DriverManager.getConnection(url,uid,pwd); Xz8$Xz,O
2)用jndi(java的命名和目录服务)方式 <|otZJ'2r
例子 !
&y
String jndi = "jdbc/db"; [qSQ#Qzi2i
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); k9cK bf@
DataSource ds = (DataSource) ctx.lookup(jndi); $$42pb.
Connection cn = ds.getConnection(); m{VL\ g)
多用于jsp中 SF0Jb"kS
2、执行sql语句 !5NGlqEF#
1)用Statement来执行sql语句 /;+oz
String sql; 5Lw{0uLr
Statement sm = cn.createStatement(); 0"hiCGm'
sm.executeQuery(sql); // 执行数据查询语句(select) Ec+22X
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); O!o <P5X^
2)用PreparedStatement来执行sql语句 :#qUMiu$
String sql; r|M'TA~:
sql = "insert into user (id,name) values (?,?)"; 'HCnB]1
PreparedStatement ps = cn.prepareStatement(sql); ^<!Ia
ps.setInt(1,xxx); #&k8TY
ps.setString(2,xxx); ehU"*9
... ;
/=L
ResultSet rs = ps.executeQuery(); // 查询 Q<dba12
int c = ps.executeUpdate(); // 更新 *JwFD^<j
*}7U`Aa
3、处理执行结果 4yhcK&
查询语句,返回记录集ResultSet O(odNQy~
更新语句,返回数字,表示该更新影响的记录数 : sFo
ResultSet的方法 &ryiG
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 0"4J"q]&
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 5H~@^!7t
>;m{{nj
4、释放连接 (:JjQ`i
cn.close(); )q^(T1
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 0Qt~K#mr/
R !9qQn?
可滚动、更新的记录集 3zbXAR*
1、创建可滚动、更新的Statement -W9gH
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 9g96 d-
该Statement取得的ResultSet就是可滚动的 ci;&CHa
2、创建PreparedStatement时指定参数 jBS'g{y-!
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Ny]lvgu9X
ResultSet.absolute(9000); \`
&ej{
批量更新 Bf/|{@
1、Statement Rw/Ciw2@?
Statement sm = cn.createStatement(); nVNs][
sm.addBatch(sql1); _$!`VA%
sm.addBatch(sql2); pVY4q0@
... SGQDro=l
sm.executeBatch() Jlz9E|*qV
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 <W?WUF
2、PreparedStatement 7O"hiDQ
PreparedStatement ps = cn.preparedStatement(sql); &h\7^=s.
{ _OLI%o
ps.setXXX(1,xxx); yk`)Cq%=;
... s_TD4~
$
ps.addBatch(); XYMxG:
}
K,6OGsh
ps.executeBatch(); C]M7GHe1q
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ve6x/ PD
SijS5irfk
事务的处理 #.o0mguU
1、关闭Connection的自动提交 Q]^Yi1PbS
cn.setAutoCommit(false); h+5@I%WX
2、执行一系列sql语句 LGAX"/LX
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close pG~'shD~Dn
Statement sm ; .ByU
sm = cn.createStatement(insert into user...); b22LT52
sm.executeUpdate(); (xbIUz.
sm.close(); db'K!M)
sm = cn.createStatement("insert into corp...); 2?*||c==*
sm.executeUpdate(); vsc&Ju%k
sm.close(); {-J:4*`
3、提交 ,b4g.CV
cn.commit(); 72u db^
4、如果发生异常,那么回滚 :1*zr
cn.rollback();