java 数据库基本操作 R|$[U
1、java数据库操作基本流程 @Mzz2&(dU
2、几个常用的重要技巧: Y=3X9%v9g
可滚动、更新的记录集 ckAsGF_B~!
批量更新 X:R%1+&*
事务处理 m,=)qex
.B6`OX&k
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 'qdg:_L"
1、取得数据库连接 yS+(<
1)用DriverManager取数据库连接 ^g-Fg>&M
例子 C(xqvK~p
String className,url,uid,pwd; qP qy4V.;
className = "oracle.jdbc.driver.OracleDriver"; >H)^6sJ;%b
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 'xQna+ %h
uid = "system"; K/Sq2:
pwd = "manager"; .|U4N/XN%q
Class.forName(className); L>0!B8X2
Connection cn = DriverManager.getConnection(url,uid,pwd); kpl~/i`4
2)用jndi(java的命名和目录服务)方式 >1m)%zt
例子 Gee~>:_Q{J
String jndi = "jdbc/db"; " \`BPN
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); W0C{~|e
DataSource ds = (DataSource) ctx.lookup(jndi); o*-h%Z.
Connection cn = ds.getConnection(); N4A&"1d&
多用于jsp中 Sy4
mZ}:
2、执行sql语句 a5X`jo
1)用Statement来执行sql语句 uXjoGcW
String sql; k{?!O\yY
Statement sm = cn.createStatement(); p}96uaC1
sm.executeQuery(sql); // 执行数据查询语句(select) 1!X1wCT
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Z@;jIH4 (
2)用PreparedStatement来执行sql语句 \>4v?\8o
String sql; *Ao2j;
sql = "insert into user (id,name) values (?,?)"; /tG 5!l
PreparedStatement ps = cn.prepareStatement(sql); B%TXw#|
ps.setInt(1,xxx); ]bs+:
ps.setString(2,xxx); qbEKp HnB
... /3OC7!~;fM
ResultSet rs = ps.executeQuery(); // 查询 7WgIhQ~
int c = ps.executeUpdate(); // 更新 n?zbUA#
$Z,i|K;
3、处理执行结果 3fm;r5
查询语句,返回记录集ResultSet x(rd$oZO
更新语句,返回数字,表示该更新影响的记录数 aB=vu=hF
ResultSet的方法 U)u\1AV5
1、next(),将游标往后移动一行,如果成功返回true;否则返回false a#YuKh?
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ;I[ht
:!(YEF#}
4、释放连接 dVPq%[J2
cn.close(); >g>f;\mD7$
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection )Y=w40Yzd
C usVW
可滚动、更新的记录集 ?@3#c
1、创建可滚动、更新的Statement /&*m1EN#o
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); v&p,Clt-2
该Statement取得的ResultSet就是可滚动的 kw6cFz
2、创建PreparedStatement时指定参数 j#7wyi5q
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); }A^1q5
ResultSet.absolute(9000); 7fap*
批量更新 j|&{e91,?
1、Statement V xp$#3 ;S
Statement sm = cn.createStatement(); O|HIO&M
sm.addBatch(sql1); <sgZ3*,A
sm.addBatch(sql2); \_lG#p|
... |P^]@om
sm.executeBatch() B jH ~Ml2
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 =Dh$yC-Zr
2、PreparedStatement M4zX*&w.T
PreparedStatement ps = cn.preparedStatement(sql); 44'=;/
{ n33JTqX
ps.setXXX(1,xxx); 1y},9ym
... ->#y(}
ps.addBatch(); c_@XQ&DC`
} 3DxZ#/!
ps.executeBatch(); t)\D
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 K?5B>dv@A
2=igS#h
事务的处理 j5PaSk&o=
1、关闭Connection的自动提交 4}.WhE|h
cn.setAutoCommit(false); di8W2cwz
2、执行一系列sql语句
]#Y|
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 0$n8b/%.
Statement sm ; ^^n+
sm = cn.createStatement(insert into user...); 8|w5QvCU?3
sm.executeUpdate(); jz{(q;
sm.close(); xP8iz?6"V
sm = cn.createStatement("insert into corp...); (:_%kmu
sm.executeUpdate(); M3DxapG
sm.close(); ?l6>6a7
3、提交 C>.]Bvg
cn.commit(); Py|H?
, 6=
4、如果发生异常,那么回滚 @/CRIei
cn.rollback();