java 数据库基本操作 Tp0bS
1、java数据库操作基本流程 SF5@Vg
2、几个常用的重要技巧: JB>b`W9
可滚动、更新的记录集 +e-G,%>9
批量更新 b*FC\:\
事务处理 fgBM_c&9T
:_@JA0n
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 `\m*+Bk[5
1、取得数据库连接 @"o@}9=d
1)用DriverManager取数据库连接 #vzEu
)Ul
例子 3 q`)*
String className,url,uid,pwd; RKPD4e>%
className = "oracle.jdbc.driver.OracleDriver"; MdXchO-Lyc
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 4WE6fJ2X
uid = "system"; > ]8a3x
pwd = "manager"; Y&
F=t/U2
Class.forName(className); =&},;VOh
Connection cn = DriverManager.getConnection(url,uid,pwd); QjC22lW-
2)用jndi(java的命名和目录服务)方式 ?_v{|
YI=
例子 in(U:04
String jndi = "jdbc/db"; y2+p1
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); :Dd$i_3=
DataSource ds = (DataSource) ctx.lookup(jndi); gd0Vp Xf'
Connection cn = ds.getConnection(); AQc,>{Lm
多用于jsp中 Z(9u<
2、执行sql语句 lhi_6&&[8
1)用Statement来执行sql语句 sF7^qrVQP9
String sql; [2dn\z28
Statement sm = cn.createStatement(); B}eA\O4}I
sm.executeQuery(sql); // 执行数据查询语句(select) meCC?YAB
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Q//,4>JKf
2)用PreparedStatement来执行sql语句 vBsP+K
String sql; /RyR>G!
sql = "insert into user (id,name) values (?,?)"; 7c;9$j
PreparedStatement ps = cn.prepareStatement(sql); ^+
wD43
ps.setInt(1,xxx); !sRngXCXk?
ps.setString(2,xxx); 5BR2?hO4
... 8&Myva
ResultSet rs = ps.executeQuery(); // 查询 c5Q<$86
int c = ps.executeUpdate(); // 更新 w ~ dk#=
c)Ic#<e(
3、处理执行结果 6&!&\
查询语句,返回记录集ResultSet 6O@J7P
更新语句,返回数字,表示该更新影响的记录数 C_ \q?>
ResultSet的方法 .c#y%S
1、next(),将游标往后移动一行,如果成功返回true;否则返回false \V>?Do7
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ~Aq5XI%i
4HAp{a1
4、释放连接 a"av#Y
cn.close(); Sggq3l$Qc
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection up2+s#
[|~2X>
可滚动、更新的记录集 }@+NN
?P
1、创建可滚动、更新的Statement .0G6flD
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); I2a6w<b
该Statement取得的ResultSet就是可滚动的 !6G?zipB
2、创建PreparedStatement时指定参数 HAYMX:%
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); | ea~'N1
ResultSet.absolute(9000); ]?h`:,]
批量更新 f,z P*
1、Statement O,<IGO
Statement sm = cn.createStatement(); ZvGgmLN
sm.addBatch(sql1); kF;5L)o
sm.addBatch(sql2); D{v8q)5r
... Jd,)a#<j
sm.executeBatch() @h?shW=^
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 \ j.x0/;
2、PreparedStatement ?%O3Oi Xz
PreparedStatement ps = cn.preparedStatement(sql); kGkA:g:
{ =&dW(uyzY
ps.setXXX(1,xxx); J4=_w
... iU+nqY'
ps.addBatch(); +uWYK9
} |xoF49
ps.executeBatch(); qi^!GA'5j
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 z^nvMTC
O8U<{jgAG
事务的处理 J!ntXF
1、关闭Connection的自动提交 ?4G|+yby
cn.setAutoCommit(false); ];+#i"l
2、执行一系列sql语句 U Q@7n1
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close qpJ{2Q
Statement sm ; qEUT90
sm = cn.createStatement(insert into user...); $ XBAZ<"hd
sm.executeUpdate(); i77GE
sm.close(); S<nq8Ebmw
sm = cn.createStatement("insert into corp...); T88Y
qI
sm.executeUpdate(); !}M,
sm.close(); I1 U7.CT
3、提交 zHfP+(ah
cn.commit(); w>xV
4、如果发生异常,那么回滚 gLE7Edcp6V
cn.rollback();