java 数据库基本操作 p~vq1D6
1、java数据库操作基本流程 j-e/nZR@
2、几个常用的重要技巧: 2ys'q!
可滚动、更新的记录集 uQIa"u7
批量更新 '85@U`e.
事务处理 v1*Lf/
Lf`LFPKb
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 35|F?Jx.r
1、取得数据库连接 !$ItBn/_
1)用DriverManager取数据库连接 }d?"i@[
例子 yhhW4rz
String className,url,uid,pwd; =B-a]?lM
className = "oracle.jdbc.driver.OracleDriver"; yqi=9NB
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ~<!b}Hv
uid = "system"; ~"6/OJA
pwd = "manager"; \D}K{P
Class.forName(className); )FVW/{NF@q
Connection cn = DriverManager.getConnection(url,uid,pwd); ,Wtod|vx\U
2)用jndi(java的命名和目录服务)方式 n%yMf!M
.:
例子 vs]#?3+
String jndi = "jdbc/db"; _1TSt%L
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); sq1Z;l31"
DataSource ds = (DataSource) ctx.lookup(jndi); a"ZBSg(
Connection cn = ds.getConnection(); -L<''2t
多用于jsp中 -b'93_ZTu:
2、执行sql语句 >U?HXu/TJr
1)用Statement来执行sql语句 P4@<`Eb
String sql; hYOUuC
Statement sm = cn.createStatement(); tu{y
sm.executeQuery(sql); // 执行数据查询语句(select) yyCx;
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); f-!t31?XK
2)用PreparedStatement来执行sql语句 7UM!<@9\
String sql; WtlPgT;wE
sql = "insert into user (id,name) values (?,?)"; ;[9WB<t
PreparedStatement ps = cn.prepareStatement(sql); vl+vzAd
ps.setInt(1,xxx); K.'II9-{
ps.setString(2,xxx); OT/*|Pn9
... 8JvF4'zx
ResultSet rs = ps.executeQuery(); // 查询 H~y 7o_tg
int c = ps.executeUpdate(); // 更新 s"G;rcS}#
l;_zXN
3、处理执行结果 ^wDZg`
查询语句,返回记录集ResultSet ,-,BtfE3
更新语句,返回数字,表示该更新影响的记录数 :wtr{,9rZ
ResultSet的方法 N&ZIsaK,j
1、next(),将游标往后移动一行,如果成功返回true;否则返回false iF:`rIC
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 BCN<l +u
QJ1_LJ4)a
4、释放连接 u
xi f-5
cn.close(); ,QW>M$g{
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection g!%C_AI
G ,,c,
可滚动、更新的记录集 lB_&Lq8G
1、创建可滚动、更新的Statement l'h[wwEXm{
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ~&)
该Statement取得的ResultSet就是可滚动的 Rf7*Ut
wVr
2、创建PreparedStatement时指定参数 2pa:
3O
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); %{'hpT~h
ResultSet.absolute(9000); RDX".'`(=
批量更新
O+D"7
1、Statement PW a!7n#A
Statement sm = cn.createStatement(); `72 uf<YQ
sm.addBatch(sql1); v}w=I}<x
sm.addBatch(sql2); J<8~w; i
... +o&&5&HR
sm.executeBatch() %*d(1?\o
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 5<1,`Bq@
2、PreparedStatement =+@Ip Xj
PreparedStatement ps = cn.preparedStatement(sql); 5\1C@d
{ B1\@ n$
ps.setXXX(1,xxx); @#sBom+K`
... 2x3'm
ps.addBatch(); GMLDmTV
} Mx&
P^#B3
ps.executeBatch(); pC9Ed9uRK
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 WPbWG$Li
nFE0y3GD8
事务的处理 L_$M9G|5n
1、关闭Connection的自动提交 aBL+i-
cn.setAutoCommit(false); \g|u|Y.2[
2、执行一系列sql语句 ;-Bi~XD
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 9D
2B8t"a
Statement sm ; NUB 3L
sm = cn.createStatement(insert into user...); !L5[s
sm.executeUpdate(); c o}o$}
sm.close(); 4.@gV/U(|
sm = cn.createStatement("insert into corp...); I^'U_"vB
sm.executeUpdate(); N[G<&f9
sm.close(); 8p3pw=p
3、提交 8!e1T,:b
cn.commit(); =l&A9 >\
4、如果发生异常,那么回滚 tF> ?]
cn.rollback();