java 数据库基本操作 ,G!mO,DX
1、java数据库操作基本流程 h\PybSW4s
2、几个常用的重要技巧: wl:[Ad
可滚动、更新的记录集 1h#UM6
批量更新 MgUjB~)Y
事务处理 "?#O*x
Q9NKQuSu
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 -Vhxnh S
1、取得数据库连接 Y<9]7R(\;
1)用DriverManager取数据库连接 U#
7K^(E9
例子 XD$;K$_7
String className,url,uid,pwd; ^A' Bghy
className = "oracle.jdbc.driver.OracleDriver"; ;J&9l
>
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; <A@qN95m
uid = "system"; i.G"21M
pwd = "manager"; !+Us) 'L
Class.forName(className); e]@R'oM?#`
Connection cn = DriverManager.getConnection(url,uid,pwd); w^wh|'u^_@
2)用jndi(java的命名和目录服务)方式 J^)=8cy
例子 "=vH,_"Ql
String jndi = "jdbc/db"; y?.l9
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); NB?y/v
DataSource ds = (DataSource) ctx.lookup(jndi); z{ MO~d9
Connection cn = ds.getConnection(); yjj)+eJ(Q
多用于jsp中 $|pD}
2、执行sql语句 )G=hgqy
1)用Statement来执行sql语句 w-?|6I}T
String sql; ua]?D2
Statement sm = cn.createStatement(); iK3gw<g
sm.executeQuery(sql); // 执行数据查询语句(select) !J-oGs\ u
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ~#y( ]Xec2
2)用PreparedStatement来执行sql语句 V4qv7
String sql; &n-)Alx
sql = "insert into user (id,name) values (?,?)"; e<1)KqG
PreparedStatement ps = cn.prepareStatement(sql); +je{%,*
ps.setInt(1,xxx); @]xHt&j
ps.setString(2,xxx); J{h?=vK
... @'fWS^ ;&
ResultSet rs = ps.executeQuery(); // 查询 MZK%IC>
int c = ps.executeUpdate(); // 更新 ZAa:f:[#f
KW-g $Ma
3、处理执行结果 pCt0[R;?
查询语句,返回记录集ResultSet Z2^B.r#
更新语句,返回数字,表示该更新影响的记录数 `=JGlN7
ResultSet的方法 6UnWtLE
1、next(),将游标往后移动一行,如果成功返回true;否则返回false O(CmdSk,
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 a?P$8NLr
Ze- MB0w
4、释放连接 B96"|v$
cn.close(); XVWVY}
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection YMD&U
3~6,fTMz{
可滚动、更新的记录集 *>8Y/3Y\B
1、创建可滚动、更新的Statement =%ZR0cWPoI
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 9G=HG={
该Statement取得的ResultSet就是可滚动的 CWW|?
2、创建PreparedStatement时指定参数 b5.L== >
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); F
uJ=]T
ResultSet.absolute(9000); SJXP}JB_
批量更新 Mv#\+|p 1x
1、Statement tX
3y{W10"
Statement sm = cn.createStatement(); A&/VO$Y9wp
sm.addBatch(sql1); IBSoAL
sm.addBatch(sql2); mj_V6`m4
... 6V^KOG
sm.executeBatch() oES4X{,
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ST7Xgma-
2、PreparedStatement Fb&WwGY,P
PreparedStatement ps = cn.preparedStatement(sql); m?_@.O@]
{ A
^U`c'$
ps.setXXX(1,xxx); 1G62Qu$O
... 4oywP^I
ps.addBatch(); t o2y#4'.
} UgAG2
ps.executeBatch(); vQhi2J'
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ruK,Z,3Q
fgE Mn;
事务的处理 ;/|3U7{c
1、关闭Connection的自动提交 >C"QV`+
cn.setAutoCommit(false); /{HK0fd
2、执行一系列sql语句 ):pFI/iC
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close V07? sc<
Statement sm ; #23m_w^L
sm = cn.createStatement(insert into user...); 4N{5i)
sm.executeUpdate(); *^t7?f[
sm.close(); vg ^&j0
sm = cn.createStatement("insert into corp...); y&{ Z"+B5
sm.executeUpdate(); d 0CFMy6
sm.close(); }&:F,q*
3、提交 n 9N'}z
cn.commit(); Y:'#jY*V
4、如果发生异常,那么回滚 JB xizJBP
cn.rollback();