java 数据库基本操作 /prYSRn8
1、java数据库操作基本流程 9t?L\
2、几个常用的重要技巧: &R,9+c
可滚动、更新的记录集 1_uvoFLk
批量更新 tmO`|tn&
事务处理 +TH3&H5I_A
?Nf
5w
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 f8=]oa]
1、取得数据库连接 6W&_2a7*
1)用DriverManager取数据库连接 S/.^7R7{f
例子 oaK.kOo
String className,url,uid,pwd; JEhm1T
className = "oracle.jdbc.driver.OracleDriver"; Q8q@Y R#
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Zsj`F9*e
uid = "system"; e`iEy=W
pwd = "manager"; /_)l|<k+V
Class.forName(className); IxOc':/jY
Connection cn = DriverManager.getConnection(url,uid,pwd); )1lu=gc
2)用jndi(java的命名和目录服务)方式 zC=a3
例子 ^
q?1U?4
String jndi = "jdbc/db"; je%l dY]/@
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); UX2lPgKdLz
DataSource ds = (DataSource) ctx.lookup(jndi); hJf2o
Connection cn = ds.getConnection(); E=AVrv5T
多用于jsp中 dY!u)M;~~
2、执行sql语句 'N\&<dT>
1)用Statement来执行sql语句 E)W@{?.o#
String sql; >zs5s
Statement sm = cn.createStatement(); jAC78n,Fi@
sm.executeQuery(sql); // 执行数据查询语句(select) d]SYP
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); (?>cn_m
2)用PreparedStatement来执行sql语句 KxIyc7.
String sql; Y.sz|u 1
sql = "insert into user (id,name) values (?,?)"; +Rwx%=
PreparedStatement ps = cn.prepareStatement(sql); C5*xQlCq}
ps.setInt(1,xxx); | kXm}K
ps.setString(2,xxx); iidT~l
... /7/0x ./{
ResultSet rs = ps.executeQuery(); // 查询 6ZOy&fd,Ty
int c = ps.executeUpdate(); // 更新 1$pb (OK
6o=G8y
3、处理执行结果 gl8Ib<{
查询语句,返回记录集ResultSet Q`ME@vz
更新语句,返回数字,表示该更新影响的记录数 S_b/DO
ResultSet的方法 q/PNJ#<
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ^A9M;q
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 p=Y>i 'CG
.tnkT;T
4、释放连接 ;a
r><w
cn.close(); Elb aFbr
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection
%w
) +V
O=}g4c
可滚动、更新的记录集 XRtD< jlA"
1、创建可滚动、更新的Statement 'wQv3;
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ^U@~+dw
该Statement取得的ResultSet就是可滚动的 T%IK/"N|+
2、创建PreparedStatement时指定参数 "& 25D
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 2S~R !
ResultSet.absolute(9000); Z9K})47T
批量更新 gb" 4B%Hm
1、Statement DHw<%Z-J
Statement sm = cn.createStatement(); ~F!,PM/
sm.addBatch(sql1); H:QhrL+7_
sm.addBatch(sql2); V
'.a)6
... *if`/N-q(m
sm.executeBatch() w0lT%CPx
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 fCw*$:O
2、PreparedStatement ;11x"S
PreparedStatement ps = cn.preparedStatement(sql); *[}^[J
x
{ "rhYCZ B
ps.setXXX(1,xxx); .0p^W9
... 8sOQ9
ps.addBatch(); ;9a 6pz<
} `]i
[]|
ps.executeBatch(); %*}Y6tl '|
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 "ju'UOcS/
kmPYx)o
事务的处理 uLR<FpM
1、关闭Connection的自动提交 vB'>[jvA|
cn.setAutoCommit(false); 6 %Mt
2、执行一系列sql语句 pG3k
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Cu;5RSr2Z
Statement sm ; v,@F|c?_S
sm = cn.createStatement(insert into user...); ?-)I+EAnE
sm.executeUpdate(); Na{Y}0=^y
sm.close(); jgv`>o%<W
sm = cn.createStatement("insert into corp...); >ut" OL9J
sm.executeUpdate(); }baR5v
sm.close(); ac{?+]8}
3、提交 ?)D^~/
A
cn.commit(); b KtD"JG\
4、如果发生异常,那么回滚 6gL-OJNo
cn.rollback();