java 数据库基本操作 W,5A|Q~
1、java数据库操作基本流程 5:/
zbt\C
2、几个常用的重要技巧: I>o+INb:
可滚动、更新的记录集 dawe!w!
批量更新 vpcx 1t<
事务处理 =`[08
=Ig'Aw$ x
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 v Ic0V
1、取得数据库连接 mv|eEz)r
1)用DriverManager取数据库连接 W!8g.r4u+,
例子 akHcN]sa2
String className,url,uid,pwd; oGx OJyD
className = "oracle.jdbc.driver.OracleDriver"; _R<eWp
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ewg&DBbN"
uid = "system"; Gf\Dc
pwd = "manager"; LvgNdVJDP|
Class.forName(className); [>QV^2'Z
Connection cn = DriverManager.getConnection(url,uid,pwd); W&ya_iP~C
2)用jndi(java的命名和目录服务)方式 !c[(#g
例子 L&ySXc=
String jndi = "jdbc/db"; $,4;_4t
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 5n!
V^ !
DataSource ds = (DataSource) ctx.lookup(jndi); 3US}('
Connection cn = ds.getConnection(); S%<RV6{aiM
多用于jsp中 \.y|=Ql_u
2、执行sql语句 IJ2 ]2FI
1)用Statement来执行sql语句 tp<uN~rTgh
String sql; 3?SofPtc/
Statement sm = cn.createStatement(); xZW6Hk_
sm.executeQuery(sql); // 执行数据查询语句(select) DKgwi'R
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); BlUl5mP}>
2)用PreparedStatement来执行sql语句 m6tbN/EJZ
String sql; {i y[8eLg
sql = "insert into user (id,name) values (?,?)"; a5ZU"6Hi
PreparedStatement ps = cn.prepareStatement(sql); {2G9>'
ps.setInt(1,xxx); Yh)yp?
ps.setString(2,xxx); S/G6NBnbS
... 4zs1BiMG
ResultSet rs = ps.executeQuery(); // 查询 ,}2yxo;i
int c = ps.executeUpdate(); // 更新 H$TYp
0KO_bF#EB=
3、处理执行结果 *c4uCI:0t
查询语句,返回记录集ResultSet gQ4Q
h;
更新语句,返回数字,表示该更新影响的记录数 HMGby2^+
ResultSet的方法 8aZuI|z
1、next(),将游标往后移动一行,如果成功返回true;否则返回false i <0H W
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 |@?B%sY
a3e<<<Z>R
4、释放连接 |6w.m<p
cn.close(); c9imfA+e
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ~L(=-B`Ow
0yr=$F(]s
可滚动、更新的记录集 .}>d[},F
1、创建可滚动、更新的Statement uH[d%y/
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); +6t<FH
该Statement取得的ResultSet就是可滚动的 2:'C|
2、创建PreparedStatement时指定参数 Z_Jprp{3h
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); =xcA4"k
ResultSet.absolute(9000); "@U9'rKx
批量更新 yzr>]"o
1、Statement |3{DlZ2S
Statement sm = cn.createStatement(); j_S///
sm.addBatch(sql1); .4Ob?ZS(
sm.addBatch(sql2); >ch{u{i6
... v9R#=m/=
sm.executeBatch() Fq/?0B8
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 wEL$QOu$
2、PreparedStatement So; ;
PreparedStatement ps = cn.preparedStatement(sql); hO^8CA,5
{ T)wc{C9w
ps.setXXX(1,xxx); CY;ML6c@
... l<5O\?Vo]
ps.addBatch(); %Z~,F?
} cnr&%-
ps.executeBatch(); YfL|FsCh
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 "]J4 BZD
^]c/hb|X
事务的处理 Fgq"d7` 9@
1、关闭Connection的自动提交 tn\Y:
cn.setAutoCommit(false); a$ a+3}\
2、执行一系列sql语句 )R$+dPu>
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close a7'.*H]
Statement sm ; lxoc.KDtR
sm = cn.createStatement(insert into user...); 2`>/y
sm.executeUpdate(); TY~8`+bJ
sm.close(); N1$lG?
)+
sm = cn.createStatement("insert into corp...); y;A<R[|Ve
sm.executeUpdate(); ~01
o
sm.close(); TP'
3、提交 9n{tbabJ
cn.commit(); hZ2!UW4'
4、如果发生异常,那么回滚 F{}mlQg
cn.rollback();