java 数据库基本操作 Y[Gw<1F_
1、java数据库操作基本流程 nI4xK
2、几个常用的重要技巧: NLJD}{8Ot
可滚动、更新的记录集 n7vLw7
批量更新
/D[GXX
事务处理 Bx&.Tj
J3sO%4sYR
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 k3m|I*_\L
1、取得数据库连接 ?80@+y]
1)用DriverManager取数据库连接 + R)x5
例子 Q#@gOn=W\
String className,url,uid,pwd; O=1uF
className = "oracle.jdbc.driver.OracleDriver"; 's{-1aW
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; h(;qnV'c
uid = "system"; o8P 5C4y
pwd = "manager"; uP/WRQ{rW>
Class.forName(className); jl<rxO?-F
Connection cn = DriverManager.getConnection(url,uid,pwd); Rk
PY@>
2)用jndi(java的命名和目录服务)方式 s0Ii;7fA{
例子 &)vX7*j
String jndi = "jdbc/db"; xDBEs*
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); F<?e79},`
DataSource ds = (DataSource) ctx.lookup(jndi); I `44}oJ
Connection cn = ds.getConnection(); XM/P2=;
多用于jsp中 GLb}_-|
2、执行sql语句 ;G.m;5A
1)用Statement来执行sql语句 `07u}]d8
String sql; fB5Bh;K
Statement sm = cn.createStatement(); ay2
m!s Q
sm.executeQuery(sql); // 执行数据查询语句(select) M* W=v
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); p[e|N;W8A
2)用PreparedStatement来执行sql语句 +w/Ax[K
String sql; Ep}KIBBO
sql = "insert into user (id,name) values (?,?)"; |}*k|
PreparedStatement ps = cn.prepareStatement(sql); %E7+W{?*1
ps.setInt(1,xxx); :^SpKe(7
ps.setString(2,xxx); ->}K- n ),
... qEE3x>&T]
ResultSet rs = ps.executeQuery(); // 查询 Z*kGWL
int c = ps.executeUpdate(); // 更新 i:WHql"Kw_
V/+r"le
3、处理执行结果 a4,bP*H
查询语句,返回记录集ResultSet |xH"Xvp:
更新语句,返回数字,表示该更新影响的记录数 =&,zWNz)
ResultSet的方法 zQ
{g~x
1、next(),将游标往后移动一行,如果成功返回true;否则返回false -e%=Mpq.
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ?ZSG4La\
$B4}('&4FQ
4、释放连接 +[r%y,k
cn.close(); i{VjSWq
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 8N(bLGUG
dv%gmUUf}k
可滚动、更新的记录集 j:|60hDz^
1、创建可滚动、更新的Statement 'oTcx Jx
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); C[rYVa
.
该Statement取得的ResultSet就是可滚动的 8N6a= [fv<
2、创建PreparedStatement时指定参数 K 3&MR=#^
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 5vYh~|
ResultSet.absolute(9000); 9Pd~
批量更新 _dsd{&
1、Statement T]EXm/
Statement sm = cn.createStatement(); 5];
8
sm.addBatch(sql1); SlZL%C;
sm.addBatch(sql2); #X"\:yN
... @D"#B@j
sm.executeBatch() D5T\X-+]O
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 R^](X*
2、PreparedStatement ]rn!+z
PreparedStatement ps = cn.preparedStatement(sql); )dF(5,y)
{ T|ZZkNP|6
ps.setXXX(1,xxx); tb/u@}")
... An[*Jx
ps.addBatch(); 4g\a$7r
} #TW$J/Jb
ps.executeBatch(); "XC6 l4Z
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 /GM-#q
a
{, APZ`q|
事务的处理 |,dMF2ADc
1、关闭Connection的自动提交 f,M$>!$V
cn.setAutoCommit(false); AV d
2、执行一系列sql语句 @dCu]0oNI
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close &v4w3'@1
Statement sm ; #yr19i ?
sm = cn.createStatement(insert into user...); a2=wJhk
sm.executeUpdate(); Y[s
sm.close(); -&,NM
sm = cn.createStatement("insert into corp...); x0lX6
|D
sm.executeUpdate(); ~g|e?$j
sm.close(); 7U.g4x|<
3、提交 kP;:s
cn.commit(); (=
!_5l
4、如果发生异常,那么回滚 XZ|"7a s
cn.rollback();