java 数据库基本操作 \t+q1S1
1、java数据库操作基本流程 YhJ*(oWL
2、几个常用的重要技巧: hxj[gE'R(
可滚动、更新的记录集 nY=]KU
批量更新 a3(q;^v
事务处理 bcE%EQ
\&1Di\eL
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 YLe$Vv735
1、取得数据库连接 Mf.:y
1)用DriverManager取数据库连接 XjV,wsZ=
例子 #>(h!lT_
String className,url,uid,pwd; GeCyq%dN
className = "oracle.jdbc.driver.OracleDriver"; X?Z#k~JR
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; UY*[='l!)
uid = "system"; gj<Y+Dv>
pwd = "manager"; N!#TK9
Class.forName(className); 8CN0Q&|
Connection cn = DriverManager.getConnection(url,uid,pwd); D4W^{/S
2)用jndi(java的命名和目录服务)方式 4XsKOv
例子 2Uq4PCx!
String jndi = "jdbc/db"; I\oI"\}U
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); %.n 7+
DataSource ds = (DataSource) ctx.lookup(jndi); bF{14F$
Connection cn = ds.getConnection(); o&vODs
多用于jsp中 eWwI@ASaA
2、执行sql语句 `PeWV[?
1)用Statement来执行sql语句 bx8|_K*^
String sql; !mtX*;b(e
Statement sm = cn.createStatement(); @(Y+W2Iyy+
sm.executeQuery(sql); // 执行数据查询语句(select) tx01*2]pX
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); RB `<Zw
2)用PreparedStatement来执行sql语句 "N4rh<<
String sql; f3Cjj]RFv
sql = "insert into user (id,name) values (?,?)"; UkV{4*E
PreparedStatement ps = cn.prepareStatement(sql); *O@uF4+!1
ps.setInt(1,xxx); Ah<6m5+
ps.setString(2,xxx); 7SpF&
... Dt p\T|)
ResultSet rs = ps.executeQuery(); // 查询 iPoDesp
int c = ps.executeUpdate(); // 更新 _'47yq^O
^GN |}W
3、处理执行结果 pX/,s#dY>
查询语句,返回记录集ResultSet X1{U''$
K
更新语句,返回数字,表示该更新影响的记录数 }^Kye23
ResultSet的方法 STH?X]
/
1、next(),将游标往后移动一行,如果成功返回true;否则返回false qX?k]m
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 nkvkHh
rlIDym9nY~
4、释放连接 {=GWQn6cc
cn.close(); fb||q-E
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 6su^yt
-H;p +XAY
可滚动、更新的记录集
-Y"'=zkO
1、创建可滚动、更新的Statement @(_M\>!%M
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); auP6\kpMe
该Statement取得的ResultSet就是可滚动的 GMO|A.bzzN
2、创建PreparedStatement时指定参数 (0/)vZc
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); iSz?V$}?
ResultSet.absolute(9000); 'aoHNZfxw
批量更新 'WW['
1、Statement dJ0qg_ U&
Statement sm = cn.createStatement(); MVpk/S%W
sm.addBatch(sql1); b#<@&0KE
sm.addBatch(sql2); ,awp)@VG7
... CH/*MA
sm.executeBatch() <M4Qc12jP
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 KoPhPH
2、PreparedStatement `]xot8
PreparedStatement ps = cn.preparedStatement(sql); v<qiu>sbz}
{ xRx8E;Q@h?
ps.setXXX(1,xxx); EL[N%M3
... 9O/l{
ps.addBatch(); M;i4ss,}!
} z
a^s%^:yK
ps.executeBatch(); #FfUkV
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 :6Q`! in
4vk^=
事务的处理 cPgz?,hE
1、关闭Connection的自动提交 ]JXpe]B
cn.setAutoCommit(false); ja2PmPv
2、执行一系列sql语句 )FG<|G(
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close -UM5&R+o
Statement sm ; @9!,]n
sm = cn.createStatement(insert into user...); !MiH^wP
sm.executeUpdate(); V\V:uo(C
sm.close(); 0bQm:J[(#
sm = cn.createStatement("insert into corp...); 'r5[tK}
sm.executeUpdate(); H8}}R~ZO
sm.close(); )@]Y1r4U
3、提交 EFgs}BV_9
cn.commit(); ;uC +5g`
4、如果发生异常,那么回滚 z!={d1u#T
cn.rollback();