java 数据库基本操作 jEZMUqGY!
1、java数据库操作基本流程 rogT~G}q
2、几个常用的重要技巧: H*r)Z90
可滚动、更新的记录集 4GX-ma,
批量更新 B\o Mn
事务处理 C)`Fv=]R
85LAYaw
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 z62;cv
1、取得数据库连接 j3{D^|0bP
1)用DriverManager取数据库连接 yjF1}SQ
例子 7Mg=b%IYs
String className,url,uid,pwd; ci?qT,&
className = "oracle.jdbc.driver.OracleDriver"; 0|{u{w@!`
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr;
@fl-3q
uid = "system"; ~
Q. 7VDz
pwd = "manager"; bAx-"Lu
Class.forName(className); SMpH._VFeE
Connection cn = DriverManager.getConnection(url,uid,pwd); zo4qG+>o
2)用jndi(java的命名和目录服务)方式 Y!nJg1
例子 3`t%g[D1
String jndi = "jdbc/db"; PoxK{Y
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ^rifRY-,yO
DataSource ds = (DataSource) ctx.lookup(jndi); xe^Gs]fm
Connection cn = ds.getConnection(); e4 >_v('
多用于jsp中 .K1FKC$C
2、执行sql语句 8@MV%MVy$
1)用Statement来执行sql语句 vH :LQ!2
String sql; V3^&oe%
Statement sm = cn.createStatement(); ,F,X
,
sm.executeQuery(sql); // 执行数据查询语句(select) m}7iTDJR9
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); hhCrUn"
2)用PreparedStatement来执行sql语句
EK6:~
String sql; Bu#VMkchJ
sql = "insert into user (id,name) values (?,?)"; wAf\|{Vn
PreparedStatement ps = cn.prepareStatement(sql); qVH1}9_
ps.setInt(1,xxx); .\)U@L~
ps.setString(2,xxx); &m-PC(W+
... E87Ww,z8
ResultSet rs = ps.executeQuery(); // 查询 w9< R#y[A
int c = ps.executeUpdate(); // 更新 LG9+y
%C|n9*
3、处理执行结果 TFlet"ge=
查询语句,返回记录集ResultSet )48QBz?
更新语句,返回数字,表示该更新影响的记录数 \hDlTp}
ResultSet的方法 8%A#`)fb
1、next(),将游标往后移动一行,如果成功返回true;否则返回false `d5%.N
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 9]f!'d!5
-p]1=@A<}
4、释放连接 dfKF%27
cn.close(); xhVO3LW'
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection v0z5j6)-1
Yc_8r+;(
可滚动、更新的记录集 WW4vn|0v
1、创建可滚动、更新的Statement .F
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 5:Z0Pt
该Statement取得的ResultSet就是可滚动的 tn(JC%?^
2、创建PreparedStatement时指定参数 IzikDc10
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); YIoQL}pX
ResultSet.absolute(9000); Z}mLLf E
批量更新 Pg,b-W?n*
1、Statement e:fy#,HEj{
Statement sm = cn.createStatement(); 8 OY 3A
sm.addBatch(sql1); U>=Z-
T
sm.addBatch(sql2); >s>1[W @*
... _x%7@.TB
sm.executeBatch() eKE#Yr
d=x
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 g!@<n1 L
2、PreparedStatement {.?ZHy\Rk
PreparedStatement ps = cn.preparedStatement(sql); Q sZx)
bO
{ UQ)W%Y;[0
ps.setXXX(1,xxx); PF)jdcX
... -lbm*
-(
ps.addBatch(); gw#5jW\
} "6MVvpy"
ps.executeBatch(); ~
{E'@MU
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 `Nz/Oh7
[~-9i&Z
事务的处理 Zn&,
t &z
1、关闭Connection的自动提交 UK595n;P
cn.setAutoCommit(false); fkuLj%R
2、执行一系列sql语句
)j9SGLo
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close d4u})
Statement sm ; .aO,8M
sm = cn.createStatement(insert into user...); W5EDVPur
sm.executeUpdate(); t[ubn+
sm.close(); EN$2,qf
sm = cn.createStatement("insert into corp...); Lm*e5JnV
sm.executeUpdate(); od IV:(
sm.close(); h].<t&
3、提交 wW7eT~w
cn.commit(); +c(zo4nZ
4、如果发生异常,那么回滚 XC4X-j3
cn.rollback();