java 数据库基本操作 +RM3EvglDQ
1、java数据库操作基本流程 qy!G&
2、几个常用的重要技巧: }5gQZ'ys'
可滚动、更新的记录集 aCanDMcBnq
批量更新 (-
uk[["3
事务处理 J]%P
fWV
5segzaI
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 `4o;Lz~
1、取得数据库连接 1yo@CaW[\
1)用DriverManager取数据库连接 P>H'od
例子 w NPZ[V:
String className,url,uid,pwd; #X)s=Y&5!T
className = "oracle.jdbc.driver.OracleDriver"; %w@(V([(c
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; k;)L-ge9
uid = "system"; (z[cf|he
pwd = "manager"; 6 3HxQH
Class.forName(className); jq[>PvR
Connection cn = DriverManager.getConnection(url,uid,pwd); bx@CzXre;
2)用jndi(java的命名和目录服务)方式 rScmUt
例子 E?;W@MJi
String jndi = "jdbc/db"; r"n)I$
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); H=dj\Br`
DataSource ds = (DataSource) ctx.lookup(jndi); BKIt,7j
Connection cn = ds.getConnection(); 6V8"[0U
多用于jsp中 rnW i<Se
2、执行sql语句 0ul2rZc
1)用Statement来执行sql语句 x&;SLEM
String sql; a+X X?uN{
Statement sm = cn.createStatement(); -Ju!2by
sm.executeQuery(sql); // 执行数据查询语句(select) *33Zt+
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 29E^]IL?
2)用PreparedStatement来执行sql语句 Y-Z.AA,
String sql; ur'A ;B
sql = "insert into user (id,name) values (?,?)"; ^ PD a
PreparedStatement ps = cn.prepareStatement(sql); _ K9jj
ps.setInt(1,xxx); 67#;.}4a
ps.setString(2,xxx); }NUP[%
... 0uZH H
ResultSet rs = ps.executeQuery(); // 查询 +pE-Yn`YS
int c = ps.executeUpdate(); // 更新 Q{>{ e3z}
(BJs6":BFe
3、处理执行结果 K
<0ItNv
查询语句,返回记录集ResultSet ?(mlt"tPk
更新语句,返回数字,表示该更新影响的记录数 L:S[QwQu8
ResultSet的方法 SnVnC09y
1、next(),将游标往后移动一行,如果成功返回true;否则返回false l<gg5 Zea
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 U#Ud~Q q
N~a?0x
4、释放连接 +VTMa9d
cn.close(); 6@bO3K|
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection @P%&Dha
<%|2yPb]
可滚动、更新的记录集 -qs9a}iL
1、创建可滚动、更新的Statement #/YKA{
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Fd3V5h
该Statement取得的ResultSet就是可滚动的 ,3x3&c
2、创建PreparedStatement时指定参数 Q|;8\5
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); &u.t5m7(
ResultSet.absolute(9000); ' (ql7
批量更新
snX5mD
1、Statement A9[l5E
Statement sm = cn.createStatement(); =n9|r.\&uJ
sm.addBatch(sql1); h_H$+!Nzb
sm.addBatch(sql2); >d_O0a*W-
... edA.Va|0
sm.executeBatch() p6|0JBm
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 $yG=exh3v
2、PreparedStatement uP<tP:
PreparedStatement ps = cn.preparedStatement(sql); *;Sj&O
{ \= i>}Sg
ps.setXXX(1,xxx); $O=m/l$
...
z7>
ps.addBatch(); D/{hLp{
} %I?uO(
@
ps.executeBatch(); ;j S~0R
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 |s=)*DZv
u0\?aeg`
事务的处理 6/ F]ncwG
1、关闭Connection的自动提交 L-vy,[9)[*
cn.setAutoCommit(false); BlMc<k
2、执行一系列sql语句 h9$Ov`N(%
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close bZz ,'
Statement sm ; xV}-[W5sr'
sm = cn.createStatement(insert into user...); (@[c;+x
sm.executeUpdate(); 9F@ Q
sm.close(); @LqLtr@A
sm = cn.createStatement("insert into corp...); xmsw'\
sm.executeUpdate(); *+rO3% ;t
sm.close(); <S<@V?h
3、提交 CM|?;PBuv
cn.commit(); }y;s(4
4、如果发生异常,那么回滚 .Xqe]cax%
cn.rollback();