java 数据库基本操作 R7K!A
%
1、java数据库操作基本流程 lT.zNhz:d9
2、几个常用的重要技巧: ddsUz1%l
可滚动、更新的记录集 v:KX9A.
批量更新 b'i'GJBQ+$
事务处理
.~3kGf":
`Da+75 f6v
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 '\`6ot8
1、取得数据库连接 EYL]TeS
1)用DriverManager取数据库连接 3{"byfO#%
例子 IU@_)I+6
String className,url,uid,pwd; ?d$"[lKX
className = "oracle.jdbc.driver.OracleDriver"; AoBoFZLl3
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 9)`amhf>
uid = "system"; z3a-+NjD m
pwd = "manager"; }e 9!xA
Class.forName(className); 4q hWm"&CM
Connection cn = DriverManager.getConnection(url,uid,pwd); 5[C ~wvO
2)用jndi(java的命名和目录服务)方式 n` q2s'Pc
例子 rH&G<o&,
String jndi = "jdbc/db"; aD9rp
V
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); mwh{ "FL(
DataSource ds = (DataSource) ctx.lookup(jndi); oid[syPB
Connection cn = ds.getConnection(); $;2)s}ci
多用于jsp中 '0|o`qoLzA
2、执行sql语句 7JUb Va%
1)用Statement来执行sql语句 z}ElpT[(;
String sql; 0DNU,u
Statement sm = cn.createStatement(); z8HsYf(!
sm.executeQuery(sql); // 执行数据查询语句(select) 9R
p2W
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); )MZC>:
2)用PreparedStatement来执行sql语句 yGTziv!
String sql; $Pxb1E
sql = "insert into user (id,name) values (?,?)"; t9FDU
PreparedStatement ps = cn.prepareStatement(sql); +2RNZEc
ps.setInt(1,xxx); )RN<GW'
ps.setString(2,xxx); ;QBh;jg4
... j!\dn!Xwt
ResultSet rs = ps.executeQuery(); // 查询 5 L/x-i
int c = ps.executeUpdate(); // 更新 $5AC1g'
2j&v;dmh<
3、处理执行结果 m@jge)O&D
查询语句,返回记录集ResultSet F8<"AI
更新语句,返回数字,表示该更新影响的记录数 G2`${aMS
ResultSet的方法 hQRL,?
1、next(),将游标往后移动一行,如果成功返回true;否则返回false _;hf<|c
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 wv?RO*E
BcQEG *N
4、释放连接 E{4 e<%Y,
cn.close(); gbDX7r-
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection cWMUj K/N
yto[8;)_
可滚动、更新的记录集 F";.6%;AC
1、创建可滚动、更新的Statement F; 8*H1
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); c 6"Ib)
该Statement取得的ResultSet就是可滚动的 ;au*V5a%
2、创建PreparedStatement时指定参数 n[,XU|2
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); |a-fE]{7
ResultSet.absolute(9000); C!+I>J{4f
批量更新 qmglb:"
1、Statement xCXQ<77
Statement sm = cn.createStatement(); Ooc\1lX
sm.addBatch(sql1); Z^yNLF *&V
sm.addBatch(sql2); "
.4,."
... `zA#z />
sm.executeBatch() VT\"q1)p
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ,
sjh^-;
2、PreparedStatement thc <xxRP
PreparedStatement ps = cn.preparedStatement(sql); OcmRZ
{ *27*>W1
ps.setXXX(1,xxx); D3D}DaEYj
... =wVJ%
ps.addBatch(); ! zL1;d
} tF7hFL5f
ps.executeBatch(); Io n~
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 NBYH;h P
X(@uw X$m
事务的处理 dtZE67KS
1、关闭Connection的自动提交 4;<ut$G
cn.setAutoCommit(false); Dnw| %6Y
2、执行一系列sql语句 Vi*e@IP/
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 8R/dA<Ww
Statement sm ; NI aFI(
sm = cn.createStatement(insert into user...); ;=4Xz\2
sm.executeUpdate(); *bd[S0l
sm.close(); 6*45Vf
sm = cn.createStatement("insert into corp...); = &tmP
sm.executeUpdate(); |kJ%`j(7R
sm.close(); )Ry<a$Q3
3、提交 M f~}/h
cn.commit(); ) ;FS7R
4、如果发生异常,那么回滚 ]p7jhd=
cn.rollback();