java 数据库基本操作 FH$q,BI!R
1、java数据库操作基本流程 :eJJL,v
2、几个常用的重要技巧: i?uX'apk
可滚动、更新的记录集 B
I3fk
批量更新 <hTHY E=
事务处理 #M+_Lk3
^3H:I8gRCl
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 |JHNFs
1、取得数据库连接 ,Oy$q~.
1)用DriverManager取数据库连接 EBz4k)@m
例子 Z2H bAI8
String className,url,uid,pwd; U,61 3G
className = "oracle.jdbc.driver.OracleDriver"; d%epM5
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; cs9h\]ZA
uid = "system"; s8P3H|0.-
pwd = "manager"; hlze]d?z
Class.forName(className); bqp^\yu-E
Connection cn = DriverManager.getConnection(url,uid,pwd); $8AW
2)用jndi(java的命名和目录服务)方式 $|3zsi2
例子 84WcaH
String jndi = "jdbc/db"; 6-)WXJ@V
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); TJZ~Rpq
DataSource ds = (DataSource) ctx.lookup(jndi); rXE0jTf:a
Connection cn = ds.getConnection(); <p/2 hHfiD
多用于jsp中 Md~._@`|K
2、执行sql语句 YhfQpe
1)用Statement来执行sql语句 4 dLnX3 v
String sql; q5'G]j{,Z
Statement sm = cn.createStatement(); 37Q8Yf_
sm.executeQuery(sql); // 执行数据查询语句(select) llWY7u"
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 1EC;t1.7
2)用PreparedStatement来执行sql语句 HuU$x;~
String sql; z\"
.(fIV
sql = "insert into user (id,name) values (?,?)"; tY!l}:E[
PreparedStatement ps = cn.prepareStatement(sql); udBIEW,`
ps.setInt(1,xxx); ZX1/6|_
ps.setString(2,xxx); "Y&
... k<+Sj
h$
ResultSet rs = ps.executeQuery(); // 查询 d
ePk}Sn
int c = ps.executeUpdate(); // 更新 Yg,b
;H
j u"?b2f
3、处理执行结果 /4c`[
查询语句,返回记录集ResultSet 4Y2I'~'
更新语句,返回数字,表示该更新影响的记录数 ^H1m8=
ResultSet的方法 V+@ }dJS
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 5y\35kT'
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 7Hgn/b[?b
rwP)TJh"
4、释放连接 6-TYOUm
cn.close(); 1IS1P)4_0
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Dykh|"
f5b|,JJ
可滚动、更新的记录集 I9>vm]
1、创建可滚动、更新的Statement &0%Zb~ts
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); dzAumWoh
该Statement取得的ResultSet就是可滚动的 SG|AJ9
2、创建PreparedStatement时指定参数 \ERxr
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ?<
teHFj
ResultSet.absolute(9000); ]sL.+.P
批量更新 /#(IV_Eol
1、Statement k}&wy
Statement sm = cn.createStatement(); +_cigxpTc
sm.addBatch(sql1); &|ne!wu
sm.addBatch(sql2); V:J|shRo
... 'q |"+;
sm.executeBatch() Us'JMZ~
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 z~3ubta8(@
2、PreparedStatement Ax;?~v4Z
PreparedStatement ps = cn.preparedStatement(sql); ]w _&%mB
{ I]+
zG
ps.setXXX(1,xxx); .FgeAxflP
... )j~{P
ps.addBatch(); K{/i2^4
} 8~R.iqLoX
ps.executeBatch(); p#]9^oA
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 knG:6tQ
O TlqJ
事务的处理 oST)E5X;7
1、关闭Connection的自动提交 i7r)9^y
cn.setAutoCommit(false); @-\=`#C**
2、执行一系列sql语句 'iZwM>l\
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close [ij) k@.
Statement sm ; JQ0Z%;"
sm = cn.createStatement(insert into user...); LTo!DUi`
sm.executeUpdate(); U+ik& R#
sm.close(); xt pY*
sm = cn.createStatement("insert into corp...); m?B=?;B9#
sm.executeUpdate(); Fs $FR-x
sm.close(); :.XlAQR~b
3、提交
~,&8)1
cn.commit(); f>C+ l(
4、如果发生异常,那么回滚 a6./;OC
cn.rollback();