java 数据库基本操作 2SHS!6:Rl
1、java数据库操作基本流程 lOJ3_8
2、几个常用的重要技巧: j8|N;;MN
可滚动、更新的记录集 {IR-g,B
批量更新 E3P2
事务处理 g+ P
8 O% ?t
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 w4%yCp[,
1、取得数据库连接 y)]L>o~
1)用DriverManager取数据库连接
1Bhd-
例子 q[Ed6FM$~
String className,url,uid,pwd; c3]X#Qa#m$
className = "oracle.jdbc.driver.OracleDriver"; 7ElU5I<S
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 2ms@CQy(00
uid = "system"; zc#$hIi
pwd = "manager"; DSX.84
Class.forName(className); 6l,oL'$}P1
Connection cn = DriverManager.getConnection(url,uid,pwd); nlsif
2)用jndi(java的命名和目录服务)方式 ^oYudb^%
例子 yG..B
String jndi = "jdbc/db"; .lE7v -e
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); {Xw6p
DataSource ds = (DataSource) ctx.lookup(jndi); Z:3SI$tO
Connection cn = ds.getConnection(); Ptj[9R
多用于jsp中 rmh 1.W
2、执行sql语句 wM
aqR"%
1)用Statement来执行sql语句 Htn''adg5
String sql; i?0+f}5<p
Statement sm = cn.createStatement(); 4t e QG
sm.executeQuery(sql); // 执行数据查询语句(select) bWEti}kW
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ;I@@PUnR
2)用PreparedStatement来执行sql语句 h#o?O k
String sql; \#O}K
sql = "insert into user (id,name) values (?,?)"; rD":Gac
PreparedStatement ps = cn.prepareStatement(sql); kD.KZV
ps.setInt(1,xxx); bDq[j8IT6
ps.setString(2,xxx); e$=UA%
... H)VzPe# {
ResultSet rs = ps.executeQuery(); // 查询 NuQ
l
int c = ps.executeUpdate(); // 更新 uS}qy-8J
@})]4H
3、处理执行结果 ;2\+O"}4H
查询语句,返回记录集ResultSet ]R?{9H|jwE
更新语句,返回数字,表示该更新影响的记录数 glo Y@k~
ResultSet的方法 bjCO@t
1、next(),将游标往后移动一行,如果成功返回true;否则返回false >A_:qyGk
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 TVs#,
3I):W9$Qp
4、释放连接 eF=cMC
cn.close();
XMpa87\
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection & cV$`L
, tb\^
可滚动、更新的记录集 t'{IE!_
1、创建可滚动、更新的Statement "`q:
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); g+1&l iV
该Statement取得的ResultSet就是可滚动的 "J(0J
2、创建PreparedStatement时指定参数 p;0p!~F=49
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Y5,[udF:O
ResultSet.absolute(9000); ":!7R<t
批量更新 (RBzpAiH
1、Statement ^T&@(|o
Statement sm = cn.createStatement(); AAW])c`.
sm.addBatch(sql1); [QZ g=."
sm.addBatch(sql2); PqDffZ^z
... \{u 9Kc
sm.executeBatch() TG^?J`
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 B/F6WQdZ
2、PreparedStatement
P#o"T4 >
PreparedStatement ps = cn.preparedStatement(sql); |S0nR<x-M
{ 1~aP)q
ps.setXXX(1,xxx); o4PJ9x5R!
... F :p9y_W
ps.addBatch(); =&~7Q"
} 9S_PZH
ps.executeBatch(); U_[<,JE
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 l2Pry'3
aP&bW))CI
事务的处理 8gn12._x
1、关闭Connection的自动提交 orON)Sks
cn.setAutoCommit(false); qSA]61U&
2、执行一系列sql语句 l.nd Wv
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close "\`>Ll
Statement sm ; :f_fp(T
sm = cn.createStatement(insert into user...); xmXuBp:M(R
sm.executeUpdate(); w_ONy9
sm.close(); 19j"Zxdg Y
sm = cn.createStatement("insert into corp...); xm$-:N0q
sm.executeUpdate(); 9Rd&Jq^
sm.close(); {'@`:p&3r
3、提交 a2%xW_e
cn.commit();
Swr
8
4、如果发生异常,那么回滚 *'to#_n&W
cn.rollback();