java 数据库基本操作 48w3gye
1、java数据库操作基本流程 M*@MkN*u&
2、几个常用的重要技巧: \QYs(nm?k
可滚动、更新的记录集 yKq;EcVx
批量更新 $^`hu%s,~
事务处理 #Etz}:%W
c[ =9Z;|
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 8CMI\yk
1、取得数据库连接 Ip?Ueaei
1)用DriverManager取数据库连接 'L= g(
例子 /n(0nU[
String className,url,uid,pwd; MQp1j:CK
className = "oracle.jdbc.driver.OracleDriver"; .'>r?%a
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; b/WVWDyob/
uid = "system"; .bew,92
pwd = "manager"; &XN*T.Y`
Class.forName(className); [NC^v.[1[
Connection cn = DriverManager.getConnection(url,uid,pwd); \5X34'7
2)用jndi(java的命名和目录服务)方式 {9Y@?
例子 ]+,Z()
String jndi = "jdbc/db"; 5tQffo8t
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); >e8t
DataSource ds = (DataSource) ctx.lookup(jndi); @bS>XWI>
Connection cn = ds.getConnection(); ~H?RHYP~
多用于jsp中 =OhhMAn
2、执行sql语句 gM_Z/$
1)用Statement来执行sql语句 Qb9) 1
String sql; vzs6YsA
Statement sm = cn.createStatement(); )W uuU [(
sm.executeQuery(sql); // 执行数据查询语句(select) <g,xc)[
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); /V:%}Z
2)用PreparedStatement来执行sql语句 KvC:(Vqj
String sql; %!LrC!6P4
sql = "insert into user (id,name) values (?,?)"; ]ujH7T
PreparedStatement ps = cn.prepareStatement(sql); 4AUY8Pxp
ps.setInt(1,xxx); FL0[V,
ps.setString(2,xxx); *}3~8fu{
... us$~6
ResultSet rs = ps.executeQuery(); // 查询 )FE'#\
int c = ps.executeUpdate(); // 更新 <@e6zQG
0^tF_."Y
3、处理执行结果
k|a{|2p
查询语句,返回记录集ResultSet vPpbm
更新语句,返回数字,表示该更新影响的记录数 IRXpk6|
ResultSet的方法 (z+[4l7
1、next(),将游标往后移动一行,如果成功返回true;否则返回false oM QH-\(}
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Y`\zLX"_m
IjD:
hR@
4、释放连接 [ *R8XXuL
cn.close(); z_r W1?|
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection %k1*&2"1#
C$M^<z
可滚动、更新的记录集 '$l*FWOEal
1、创建可滚动、更新的Statement (w@|:0t^y[
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); @v@'8E Q
该Statement取得的ResultSet就是可滚动的 '}LH,H:%G
2、创建PreparedStatement时指定参数 (w4#?_
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); m[]pIXc(
ResultSet.absolute(9000); P?\rRB
批量更新 cXtL3T+
1、Statement Q
>)?_O(
Statement sm = cn.createStatement(); 1*G7Uh@K}
sm.addBatch(sql1); T3wR0,
sm.addBatch(sql2); ,tmo6D6 2
... I0GL/a4s
sm.executeBatch() Eq'YtqU
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Y"G$^3% (]
2、PreparedStatement Koahd=
PreparedStatement ps = cn.preparedStatement(sql); aD24)?db-
{ H~@aT7
ps.setXXX(1,xxx); &UQKZ.
... Pbd#Fu;
ps.addBatch(); $Iv*?S"2
} j@2-^q:`
ps.executeBatch(); G8f7N;D
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 rTW1'@E
[ZDJs`h!`
事务的处理 I3s'44
1、关闭Connection的自动提交 i1 C]bUXA
cn.setAutoCommit(false); I-&/]<5y
2、执行一系列sql语句 Lp1wA*
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close RhX
2qsva-
Statement sm ; TDy@Y>
)
sm = cn.createStatement(insert into user...); <N+l"Re#]
sm.executeUpdate(); ~"+[VE5
sm.close(); RSzp-sKB
sm = cn.createStatement("insert into corp...); @DY0Lz;
sm.executeUpdate(); DpI_`TF#$Z
sm.close(); ?jz{fU
3、提交 |oPqX %?
cn.commit(); 7q$9\RR5
4、如果发生异常,那么回滚 Ay"x<JB{U2
cn.rollback();