java 数据库基本操作 LyJTK1]#
1、java数据库操作基本流程 j61BP8E
2、几个常用的重要技巧: #a7Amh\nT
可滚动、更新的记录集 }#\;np
批量更新 E< zT
事务处理 v @$evmA
'f=) pc#&g
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Ckl7rpY+
1、取得数据库连接 0@sr
NuW
1)用DriverManager取数据库连接 V7B=+(xK
例子 fG8}= xH_&
String className,url,uid,pwd; #.\,y>`
className = "oracle.jdbc.driver.OracleDriver"; WTV3p,;6a
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; c-s`>m
uid = "system"; 4! Oa4
pwd = "manager"; 1c<CEq:?e%
Class.forName(className); 66^1&D"
Connection cn = DriverManager.getConnection(url,uid,pwd); in=k:j,U0
2)用jndi(java的命名和目录服务)方式 )}k?r5g
例子 c{m
;"ZCFS
String jndi = "jdbc/db"; CfkNy[}=
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); eB<V%,%N#
DataSource ds = (DataSource) ctx.lookup(jndi); !OuTXa,IH
Connection cn = ds.getConnection(); s%L"
c
多用于jsp中 RAg|V:/M
2、执行sql语句 VQNYQqu`[
1)用Statement来执行sql语句 s{"`=dKT
String sql; I |<+'G
Statement sm = cn.createStatement(); 9z|>roNe
sm.executeQuery(sql); // 执行数据查询语句(select) L6[rvM|9_
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); L5zG0mC8
2)用PreparedStatement来执行sql语句 DK@w^ZW6JA
String sql; e~t}z_>F
sql = "insert into user (id,name) values (?,?)"; :"<B@Z
PreparedStatement ps = cn.prepareStatement(sql); 6PzN>+t^y
ps.setInt(1,xxx); gq/ePSa
ps.setString(2,xxx); ,IT)zCpaBP
... }> !"SU:d
ResultSet rs = ps.executeQuery(); // 查询 8aZey_Hw;+
int c = ps.executeUpdate(); // 更新 sO{0hZkc
~*' 8=D?)
3、处理执行结果 |z(Ws
查询语句,返回记录集ResultSet |oBdryi
更新语句,返回数字,表示该更新影响的记录数 0'V-
ResultSet的方法 pE(<XD3Q
1、next(),将游标往后移动一行,如果成功返回true;否则返回false L6rs9su=7
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 {x&jh|f`g
*&hXJJ[+
4、释放连接 &-8-xw#.
cn.close(); ~P]HG;$?n
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection qa0JQ_?o]
r_g\_y7ua
可滚动、更新的记录集 m m J)m
1、创建可滚动、更新的Statement 0'\FrG
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); k@t,[
该Statement取得的ResultSet就是可滚动的 G3_mWppH
2、创建PreparedStatement时指定参数 YA;8uMqh;
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Y&05
*b"
ResultSet.absolute(9000); -;@5Ua1uf
批量更新 zNsL^;uT
1、Statement /4"S}P>f
Statement sm = cn.createStatement(); AG$-U2ap
sm.addBatch(sql1); d,oOn.n&
sm.addBatch(sql2); {o5K?Pb
... Gh gvRR$
sm.executeBatch() cP#]n)<
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 8Snq75Q<
2、PreparedStatement )HzITsFZKT
PreparedStatement ps = cn.preparedStatement(sql); ~kj(s>xP
{ #o r7T^
ps.setXXX(1,xxx); ]:E! i^C`Z
... ~\)&{'
ps.addBatch(); d'AviW>
} V&,<,iNN
ps.executeBatch(); 5cNzG4z
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 qh(-shZ4Du
T24#gF~
事务的处理 L"[wa.<
1、关闭Connection的自动提交 S)'q:`tZo
cn.setAutoCommit(false); )(ZPSg$/F
2、执行一系列sql语句 zy/tQGTr@
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close |{/O)3
Statement sm ; ILr6W@o5A
sm = cn.createStatement(insert into user...); Y3MR:{}
sm.executeUpdate(); vn%U;}
sm.close(); h[`Op#^x3
sm = cn.createStatement("insert into corp...); Eps\iykB
sm.executeUpdate(); tFST.yT>zg
sm.close(); bJ,=yB+0
3、提交 [>J~M!yu:r
cn.commit(); {ZsWZJ!
4、如果发生异常,那么回滚 eVCkPv*
cn.rollback();