java 数据库基本操作 ]\RRqLDzkg
1、java数据库操作基本流程 P\CDd=yWc
2、几个常用的重要技巧: '2zL.:~
可滚动、更新的记录集 x( mE<UQN
批量更新 NvjJb-u
事务处理 ?t@v&s
h;lirvO|
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 *b}>cn)<v
1、取得数据库连接 (yo;NKq,@
1)用DriverManager取数据库连接 <ktzT&A
例子 )x#5Il
H
String className,url,uid,pwd; ]<DNo&fw
className = "oracle.jdbc.driver.OracleDriver"; 9]$8MY
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ,D6v4<jh
uid = "system"; m\/(w_/?
pwd = "manager"; R6 XuA(5
Class.forName(className); =rPrPb
Connection cn = DriverManager.getConnection(url,uid,pwd); Kt>X[o3m,
2)用jndi(java的命名和目录服务)方式 @&1Wyp
例子 9@$,oM=
String jndi = "jdbc/db"; N^VD=<#T
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); /RLq>#:h**
DataSource ds = (DataSource) ctx.lookup(jndi); `nR %Cav,U
Connection cn = ds.getConnection(); t<:D@J]a
多用于jsp中 #0b&^QL
2、执行sql语句 b4Y8N"hL%
1)用Statement来执行sql语句 RnfXN)+P
String sql; +kdySWF
Statement sm = cn.createStatement(); mxSKG>
O
sm.executeQuery(sql); // 执行数据查询语句(select) !0/z>#b
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Q4s&E\}
2)用PreparedStatement来执行sql语句 _nT{g
String sql; Hg}I]!B
sql = "insert into user (id,name) values (?,?)"; {mE! Vf
PreparedStatement ps = cn.prepareStatement(sql); p<WFqLe(":
ps.setInt(1,xxx); 7=4 A;Ybq
ps.setString(2,xxx); VVWM9x
... RaSz>-3d
ResultSet rs = ps.executeQuery(); // 查询 e2$]g>
int c = ps.executeUpdate(); // 更新 .V6-(d
E&
36H
3、处理执行结果 A CNfS9M_w
查询语句,返回记录集ResultSet 2=PBxDs;
更新语句,返回数字,表示该更新影响的记录数 ghk5rl$
ResultSet的方法 e`{0d{Nd
1、next(),将游标往后移动一行,如果成功返回true;否则返回false |P6EO22p
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 I.}1JJF*
_baYn`tFw-
4、释放连接 s_jBu
cn.close(); 4aZCFdc
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection c(-Mc6
xSpC'"
可滚动、更新的记录集 k7_I$<YDj
1、创建可滚动、更新的Statement |c-LSs'\
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Oi:JiD=
该Statement取得的ResultSet就是可滚动的 -7'#2P<)
2、创建PreparedStatement时指定参数 9CUimZ
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); #:3r4J%+~
ResultSet.absolute(9000); %IpSK 0<Sp
批量更新 <2
1、Statement ?BCy J
Statement sm = cn.createStatement(); MBk"KF
sm.addBatch(sql1); #`GbHxd
sm.addBatch(sql2); }wt%1v-10U
... a j|5 #
sm.executeBatch() o}8{Bh^
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 t\j!K2
2、PreparedStatement d+z[\i
PreparedStatement ps = cn.preparedStatement(sql); urY`^lX~
{ G2mNm'0
ps.setXXX(1,xxx); FN"rZWM
... +?-qfp,:0
ps.addBatch(); w`yx=i#
} 6X+}>qy
ps.executeBatch(); 67<CbQZoN3
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 J;~|ph
(b/d0HCND
事务的处理 MM#cLw
1、关闭Connection的自动提交 &jts:^N>
cn.setAutoCommit(false); #dJ 2Q_2
2、执行一系列sql语句 _=`x])mM
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close o0;7b>Tv
Statement sm ; rb_Z5T
sm = cn.createStatement(insert into user...); :q2YBa
sm.executeUpdate(); K, (65>86;
sm.close(); ;:#U6?=t
sm = cn.createStatement("insert into corp...); }F{=#Kqn^
sm.executeUpdate(); O OlTrLL
sm.close(); +!&$SNLh(
3、提交 :B#EqeI
cn.commit(); y~#\#w{
4、如果发生异常,那么回滚 ZW ye>]
cn.rollback();