java 数据库基本操作 #"YWz)8
1、java数据库操作基本流程 _~&vs<
2、几个常用的重要技巧: ?B:wV?-`
可滚动、更新的记录集 eOO*gM=
批量更新 -ns a3P
事务处理 X_S]8Aa
F7u%oLjr
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 (=B7_jrl
1、取得数据库连接 ^
/eSby
1)用DriverManager取数据库连接 |2` $g
例子 sWzXl~JbF
String className,url,uid,pwd; ;8Q?`=a
className = "oracle.jdbc.driver.OracleDriver";
SL5DWZ
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; `l40awGCz
uid = "system"; !b8|{#qh.
pwd = "manager"; c)~|#v
Class.forName(className); X
\ZUt
>
Connection cn = DriverManager.getConnection(url,uid,pwd); _^$b$4)
2)用jndi(java的命名和目录服务)方式 %ycT}Lu
例子 s"!}=kX
String jndi = "jdbc/db"; (:k`wh&
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); u<r('IW0
DataSource ds = (DataSource) ctx.lookup(jndi); (?wKBUi
Connection cn = ds.getConnection(); *njB
fH'
多用于jsp中 bv" ({:x
2、执行sql语句 rIy,gZr.U
1)用Statement来执行sql语句 IRD?.K]*
String sql; _},u[+
Statement sm = cn.createStatement(); .h{`e>d
sm.executeQuery(sql); // 执行数据查询语句(select) B!6?+<J"
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); yy G:Kl
2)用PreparedStatement来执行sql语句 o AvX(
String sql; OTSbhI'v
sql = "insert into user (id,name) values (?,?)"; .I<#i9Le
PreparedStatement ps = cn.prepareStatement(sql); I)T]}et
ps.setInt(1,xxx); Ub0g{
ps.setString(2,xxx); *GD?d2.6j
... R0AVAUG
ResultSet rs = ps.executeQuery(); // 查询 {4\(HrGNk
int c = ps.executeUpdate(); // 更新 .t$~>e
.
NZCPmst
3、处理执行结果 :Fu.S1j$
查询语句,返回记录集ResultSet O\8_;Gc;
更新语句,返回数字,表示该更新影响的记录数 WF`y j%0
ResultSet的方法 {|a=
1、next(),将游标往后移动一行,如果成功返回true;否则返回false .r $d
8J
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 6Xbo:#
$SA8$!:
4、释放连接 {p-&8-
cn.close(); ^pIT,|myY7
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Xb.WI\Eh
w7s+6,
可滚动、更新的记录集 tWT@%(2~0
1、创建可滚动、更新的Statement } U\n:@:2B
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); (w`9*1NO
该Statement取得的ResultSet就是可滚动的 cl/}PmYIZ
2、创建PreparedStatement时指定参数 G?v]p~6
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); >+LFu?y
ResultSet.absolute(9000); R$sG*=a!8j
批量更新 IXc"gO
1、Statement bC&*U|de
Statement sm = cn.createStatement(); :>+}|(v
sm.addBatch(sql1); OLg=kF[[
sm.addBatch(sql2); @FU9!
... ha&2V=
sm.executeBatch() @Ge\odfF:
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 B=8],_
2、PreparedStatement ;%{REa
PreparedStatement ps = cn.preparedStatement(sql); PS7ta?V
QC
{ X mJu{RbS
ps.setXXX(1,xxx); <xv@us7
... GAI(=
ps.addBatch(); &>,c..Ke
} Ahv %Q%m%2
ps.executeBatch(); !#xk?L yB
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 )!+~q!A
P;GRk6
事务的处理 ER-X1fD
1、关闭Connection的自动提交 Rw-!P>S$
cn.setAutoCommit(false); 8&t3a+8l
2、执行一系列sql语句 *.qm+#8W
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close $q%r}Cdg
Statement sm ; ^}8qPBz
sm = cn.createStatement(insert into user...); js^+ {~
sm.executeUpdate(); DPqk~ KCM
sm.close(); RzgA;ZC'
sm = cn.createStatement("insert into corp...); W:VRLT>w>
sm.executeUpdate(); 3g
ep_aC
sm.close(); 41dB4Td5t
3、提交 :QGgtTEV""
cn.commit(); vVBu/)
4、如果发生异常,那么回滚 ^qvN:v$1
cn.rollback();