java 数据库基本操作 JJ?rVq1g
1、java数据库操作基本流程 b}0h()v
2、几个常用的重要技巧: 9_:"`)]3B
可滚动、更新的记录集 7mMGH(
批量更新 "*t6KXVaM
事务处理 a,RCK~GR
%hYgG;22
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 '_.qhsS
1、取得数据库连接 pz['o
1)用DriverManager取数据库连接 /CsP@f_Gw
例子 7<WS@-2I#
String className,url,uid,pwd; ~CnnN[g(_
className = "oracle.jdbc.driver.OracleDriver"; g_syGQ\
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ={P`Tve
uid = "system"; [ZSC]w^
pwd = "manager"; $]E+E.P
Class.forName(className); g[pU5%|"[
Connection cn = DriverManager.getConnection(url,uid,pwd); -\?-
2)用jndi(java的命名和目录服务)方式 Zhfg
例子 fIQ,}>
String jndi = "jdbc/db"; 66eJp-5e8
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); K}@rte
DataSource ds = (DataSource) ctx.lookup(jndi); r]p3DQ
Connection cn = ds.getConnection(); !9/`PcNIpy
多用于jsp中 QNMZR
2、执行sql语句 <>\|hno}
1)用Statement来执行sql语句 `Fr ,,Q81\
String sql; -GPBX?
Statement sm = cn.createStatement(); a&8K5Z%0
sm.executeQuery(sql); // 执行数据查询语句(select) >tcEx(
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ;Y*K!iFWH
2)用PreparedStatement来执行sql语句 3qe`#j
String sql; ^w1+b;)
sql = "insert into user (id,name) values (?,?)"; (y>N\xS9
PreparedStatement ps = cn.prepareStatement(sql); d[3me{Rs
ps.setInt(1,xxx); G:$kGzhJ
ps.setString(2,xxx); nA,=g'7S
... SQcic]Ep
ResultSet rs = ps.executeQuery(); // 查询 xc}[q`vK
int c = ps.executeUpdate(); // 更新 ch0^g8@Q[
(X"5x]7]
3、处理执行结果 %(eQ1ir +
查询语句,返回记录集ResultSet =figat
更新语句,返回数字,表示该更新影响的记录数 G`0O5G:1
ResultSet的方法 <9fXf*
1、next(),将游标往后移动一行,如果成功返回true;否则返回false AEyD?^?
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 x7zc3%T's
:wIA.1bK}
4、释放连接 MZh.Xo
cn.close(); 1 gjaTPwY
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection %@a;q?/?Nd
,ZJ}X 9$<
可滚动、更新的记录集 BNdq=|,+"
1、创建可滚动、更新的Statement jJiuq#;T3
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); X.4WVI
该Statement取得的ResultSet就是可滚动的 U%:%. Bys
2、创建PreparedStatement时指定参数 [l5jPL}6
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ~q566k!Ll!
ResultSet.absolute(9000); 9/0H,qZc
批量更新 PDD2ouv4
1、Statement `S|F\mI~
Statement sm = cn.createStatement(); $GRw k>N
sm.addBatch(sql1); 9abUh3
sm.addBatch(sql2); 2Cp4aTGv#
... 3pWav
1"
sm.executeBatch() L.@$rFhA
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 |9S8sfw
2、PreparedStatement <h/q^| tZ{
PreparedStatement ps = cn.preparedStatement(sql); M{24MF
{ g.9C>>tj
ps.setXXX(1,xxx); h8UhrD<:
... u/j\pDl.
ps.addBatch(); Hu<]*(lK%
} I(~([F2
ps.executeBatch(); PxrT@.T$
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 .Bl:hk\
*x2!N$b
事务的处理 fs#9~b3
1、关闭Connection的自动提交 :.g/=Q(T~
cn.setAutoCommit(false); !u]@Ru34
2、执行一系列sql语句 |=IJ^y(x|
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close y+iRZ%V^
Statement sm ; 75Z|meG~
sm = cn.createStatement(insert into user...); AJi+JO-
sm.executeUpdate(); wGLMLbj5
sm.close(); <T[LugI
sm = cn.createStatement("insert into corp...); 3'.3RKV
sm.executeUpdate();
6NV592
sm.close(); s 7 nl
3、提交 G]aey>)
cn.commit(); a%`Yz"<lQ
4、如果发生异常,那么回滚 ^x O](,H
cn.rollback();