java 数据库基本操作 m?gGFxo
1、java数据库操作基本流程 5i}g$yjZ<
2、几个常用的重要技巧: $ce*W9`
可滚动、更新的记录集 Ly/
批量更新 0176
事务处理 B873UN
@LFB}B
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 t&p I
1、取得数据库连接 XwfR/4
1)用DriverManager取数据库连接 >Q'*~S@v3
例子 |#{ i7>2U
String className,url,uid,pwd; ;>/yY]F7
className = "oracle.jdbc.driver.OracleDriver"; A^$xE6t
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; >JA>np
uid = "system"; 8_ascvs5
pwd = "manager"; j/q&qrlL
Class.forName(className); _;%l~q/
Connection cn = DriverManager.getConnection(url,uid,pwd); x}O,xquY
2)用jndi(java的命名和目录服务)方式 7SN61)[m
例子 8GRB6-.h
String jndi = "jdbc/db"; \3]O?'
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); $BT[fJ'k
DataSource ds = (DataSource) ctx.lookup(jndi); GIT"J}b}
Connection cn = ds.getConnection(); HO_(it \
多用于jsp中 ?Q$a@)x#
2、执行sql语句 9~$E+m(
1)用Statement来执行sql语句 ;q5|If
String sql; H |7XfM
Statement sm = cn.createStatement(); *_d N9
sm.executeQuery(sql); // 执行数据查询语句(select) *wsZ aQ
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 4<vi@,s
2)用PreparedStatement来执行sql语句 l^KCsea#
String sql; j6};K ~N`
sql = "insert into user (id,name) values (?,?)"; $RB
p!7
PreparedStatement ps = cn.prepareStatement(sql); }D?qj3?bj
ps.setInt(1,xxx); SSbx[<E3
ps.setString(2,xxx); ^7*7^<
... v,8Q9<=O
ResultSet rs = ps.executeQuery(); // 查询 AC 2kG
int c = ps.executeUpdate(); // 更新 DF>tQ
9ZG:2ncdJ
3、处理执行结果 lFduX D
查询语句,返回记录集ResultSet @ULWVS#t2
更新语句,返回数字,表示该更新影响的记录数 /2hRLyeAZ
ResultSet的方法 +S+=lu _
1、next(),将游标往后移动一行,如果成功返回true;否则返回false FC~%G&K/q^
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 X h}D_c
fYzP4
4、释放连接 X$@qs9?)^
cn.close(); 00s)=A_
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection XPZ8*8JL
Vy| 4k2
可滚动、更新的记录集 -j2y#aP
1、创建可滚动、更新的Statement Ml;` *;
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ?=^\kXc[
该Statement取得的ResultSet就是可滚动的 lzz;L
z
2、创建PreparedStatement时指定参数 fBh/$
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Hq,@j{($
ResultSet.absolute(9000); ,!LY:pMK
批量更新 Mu-kvgO`L
1、Statement Owgy<@C
Statement sm = cn.createStatement(); C(h Td%
sm.addBatch(sql1); !*HJBZ]q
sm.addBatch(sql2); [)dIt@Y&j
... )n1[#x^I
sm.executeBatch() F |R7hqf
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 r{84Y!k~*
2、PreparedStatement q_ryW$/_
PreparedStatement ps = cn.preparedStatement(sql);
$cc]Av4c2
{ 5W&L cBB
ps.setXXX(1,xxx); 6$f\#TR
... 80T2EN:$
ps.addBatch(); >p0,]-.J,r
} WC37=8mA
ps.executeBatch(); <%`Rku
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 _h1eW9q
ZBFn
事务的处理 km][QEXs%
1、关闭Connection的自动提交 ~(yW#'G
cn.setAutoCommit(false); L|:CQ
2、执行一系列sql语句 P,a9B2
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Q4/BpKL
Statement sm ; ;Zj(**#H
sm = cn.createStatement(insert into user...); _Gaem"k|
sm.executeUpdate(); arRU` 6?
sm.close(); w)RedJnf
sm = cn.createStatement("insert into corp...); _Y/*e<bU
sm.executeUpdate(); HZ}Igw.Z
sm.close(); 5XzsqeG|
3、提交 A+frKoi
cn.commit(); ZZHzC+O#^
4、如果发生异常,那么回滚 @V:Y%#%
cn.rollback();