java 数据库基本操作 6"o,)e/z
1、java数据库操作基本流程 'DhH:PR
2、几个常用的重要技巧: s)A=hB-V
可滚动、更新的记录集 -X]?ql*%`
批量更新 F.Sc2n@7-
事务处理 h,*-V 'X.k
kB!
iEoIBA
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 y/.I<5+Bu
1、取得数据库连接 M#u~]?hS
1)用DriverManager取数据库连接 0Tv0:c>8;(
例子 GG=R!+p2
String className,url,uid,pwd; { Mv$~T|e7
className = "oracle.jdbc.driver.OracleDriver"; .UGbo.e
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; -f-@[; D
uid = "system"; TOH+JL8L
pwd = "manager"; srGF=1_
Class.forName(className); (nDen5Q|
Connection cn = DriverManager.getConnection(url,uid,pwd); CMiE$yC
2)用jndi(java的命名和目录服务)方式 Tlar@lC|u
例子 nOm-Yb+F
String jndi = "jdbc/db"; V[#$Sz[G
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); b(HbwOt~3
DataSource ds = (DataSource) ctx.lookup(jndi); K ; eR)
Connection cn = ds.getConnection(); Y00hc8<
多用于jsp中 "y7IH
GJ\3
2、执行sql语句 4!U)a
1)用Statement来执行sql语句 lf9mdbm
String sql; }m -A #4.
Statement sm = cn.createStatement(); Lz/{
q6>
sm.executeQuery(sql); // 执行数据查询语句(select) p Lwtm@
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); olxnQYFo
2)用PreparedStatement来执行sql语句 FoW|BGA~
String sql; xbNL <3"a
sql = "insert into user (id,name) values (?,?)"; <*3#nA-O>i
PreparedStatement ps = cn.prepareStatement(sql); )JXlPU
ps.setInt(1,xxx);
PKg>|]Rf.
ps.setString(2,xxx); PNp-/1Cx
... VkD}gJY
ResultSet rs = ps.executeQuery(); // 查询 Q`zW[Y&]
int c = ps.executeUpdate(); // 更新 =K;M\_k%y
(7 O?NS
3、处理执行结果 8-s7s!j
查询语句,返回记录集ResultSet =M ."^X
更新语句,返回数字,表示该更新影响的记录数 kQ99{lH,5
ResultSet的方法 dr gCr:Gf
1、next(),将游标往后移动一行,如果成功返回true;否则返回false x:E:~h[.^
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ([ODmZHv
h|{DIG3
4、释放连接 CeINODcT
cn.close(); o:c:hSV
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection MC~<jJ,
\"|7o8
可滚动、更新的记录集 vUR@P
-
1、创建可滚动、更新的Statement wv.HPmq
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); TMG|"|
该Statement取得的ResultSet就是可滚动的 (&!x2M
2、创建PreparedStatement时指定参数 (7A- cC
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); d",VOhW7)S
ResultSet.absolute(9000); DEQ7u`6
批量更新 *%n(t+'q
1、Statement /4YxB,
Statement sm = cn.createStatement(); >* h3u7t
sm.addBatch(sql1); r:U/a=V
sm.addBatch(sql2); ~F.kgX
... miB+'n"zS
sm.executeBatch() fo_*Uva_
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 h#}'9oA
2、PreparedStatement ') K'Ea
PreparedStatement ps = cn.preparedStatement(sql); \qkb8H
{ 560`R>
ps.setXXX(1,xxx); bWg!/K55
... R*l3 zn>
ps.addBatch(); 1'!%$D
} sP@7%p>wt
ps.executeBatch();
x0||'0I0
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 K)#6&\0tT
%cl{J_}{&
事务的处理 6){nu rDBG
1、关闭Connection的自动提交 ,FK.8c 6g
cn.setAutoCommit(false); <AN5>:k[pM
2、执行一系列sql语句 Sv\399(
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close )ml#2XP!f
Statement sm ; T_ga?G<
sm = cn.createStatement(insert into user...); 4Cp)!Bq?/
sm.executeUpdate(); M&}_3
sm.close(); gv7@4G
sm = cn.createStatement("insert into corp...); "]}?{2i;
sm.executeUpdate(); CE7{>pl
sm.close(); #b@ sV$
3、提交 9R99,um$
cn.commit(); 9;ie[sU:u
4、如果发生异常,那么回滚 fbW<c`L H
cn.rollback();