java 数据库基本操作 S$Fq1
1、java数据库操作基本流程 kIYV%O
2、几个常用的重要技巧: 5tl uS
可滚动、更新的记录集 HDT-f9%}<4
批量更新 |iB
svI:
事务处理 2V =bE-
"3:TrM$|A
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Z1M{5E
1、取得数据库连接 $#d.@JWi
1)用DriverManager取数据库连接 L=5Fvm
例子 t+Hx&_pMj
String className,url,uid,pwd; %%f(R7n
className = "oracle.jdbc.driver.OracleDriver"; dSIZsapH
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Zywx.@!
uid = "system"; ]eIV'lP,j/
pwd = "manager"; ~3s\Q%
Class.forName(className); =hB0p^a
Connection cn = DriverManager.getConnection(url,uid,pwd); 7NDjXcuq
2)用jndi(java的命名和目录服务)方式 8S7 YVsDz"
例子 ouR(l;
String jndi = "jdbc/db"; +~1~f'4J
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 9aZ^m$tAt
DataSource ds = (DataSource) ctx.lookup(jndi); }uk]1M2=
Connection cn = ds.getConnection();
6i_dL|c
多用于jsp中 ;B@-RfP
2、执行sql语句 ,]|*~dd>G
1)用Statement来执行sql语句 xl;0&/7e
String sql; c %.vI
Statement sm = cn.createStatement(); \h 1 T/_4
sm.executeQuery(sql); // 执行数据查询语句(select) My JG2C#R
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 6pY<,7t0
2)用PreparedStatement来执行sql语句 Y'v;!11#
String sql; y]TNjLpo$
sql = "insert into user (id,name) values (?,?)"; R3Ka^l8R|
PreparedStatement ps = cn.prepareStatement(sql); < .B^\X$
ps.setInt(1,xxx); Jl(G4h V'\
ps.setString(2,xxx); Ug,23
... zV"oB9\9O
ResultSet rs = ps.executeQuery(); // 查询 j9/Ev]im|F
int c = ps.executeUpdate(); // 更新 Z@bGLS
B[nkE+s
3、处理执行结果 \]+57^8r
查询语句,返回记录集ResultSet ~7Jj\@68
更新语句,返回数字,表示该更新影响的记录数 #Ez+1
ResultSet的方法 f!aE/e\
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Qv>rww]
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 IYk^eG:;
ZP^7`q)6
4、释放连接 ;IX*4E'4s
cn.close(); <{UjO
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection `Aa*}1
qmM%MPv
可滚动、更新的记录集 wx%TQ!
1、创建可滚动、更新的Statement _F9O4Q4
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); *QT|J6ng
该Statement取得的ResultSet就是可滚动的 kw.IVz<
2、创建PreparedStatement时指定参数 mFXkrvOf,
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); K7N.gT*4
ResultSet.absolute(9000); a5xmIp@6
批量更新 q^k]e{PD
1、Statement @ME
.
Statement sm = cn.createStatement(); Z-B b,8
sm.addBatch(sql1); K{x FhdW
sm.addBatch(sql2); +Jv*u8T'
... C^ hCT
sm.executeBatch() DR w;.it2
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Oe[qfsdW
2、PreparedStatement jJDYl( [
PreparedStatement ps = cn.preparedStatement(sql); .&Ok53]b
{ xRU ~hQ
ps.setXXX(1,xxx); duk:: |{F
... KGoHn6jM
ps.addBatch(); l`A4)8Y@
} ,t=12R]>
ps.executeBatch(); ,dO$R.h
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 81<0B@E
Z2x%
事务的处理 :u$+lq
1、关闭Connection的自动提交 Qo;#}%}^^
cn.setAutoCommit(false); )Mj
$/
2、执行一系列sql语句 eX@7f!uz
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close J\ V.J/
Statement sm ; GxR, 3
sm = cn.createStatement(insert into user...); Cq-#|+zr
sm.executeUpdate(); Ud8*yB
sm.close(); ';hTGLq\X
sm = cn.createStatement("insert into corp...); oz- k_9%
sm.executeUpdate(); ~1yMw.04V
sm.close(); tuiQk=[c
3、提交 bn$}U.m$-
cn.commit(); 11Hf)]M
4、如果发生异常,那么回滚 tSvklI
cn.rollback();