java 数据库基本操作
9I:H=5c
1、java数据库操作基本流程 ?th`5K30
2、几个常用的重要技巧: '1[}PmhD
可滚动、更新的记录集 +IiL(\ew
批量更新 ~7tG%{t%
事务处理 u:Q_XXT5
S"iz
fQ@
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 UGNFWZ c
1、取得数据库连接 {]aB3
1)用DriverManager取数据库连接 &n.7~C]R
例子 [WDtr8L
String className,url,uid,pwd; AKVll
className = "oracle.jdbc.driver.OracleDriver"; gu[3L
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; h^h!OQK Q
uid = "system"; |RBgJkS;8
pwd = "manager"; .6yC' 3~;o
Class.forName(className); #TLqo(/
Connection cn = DriverManager.getConnection(url,uid,pwd); C< GS._V&
2)用jndi(java的命名和目录服务)方式 lZ5 lmsCU
例子 d`U{-?N>
String jndi = "jdbc/db"; 7dXR/i \
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); y5L%_
{n
DataSource ds = (DataSource) ctx.lookup(jndi); ?3wEO>u
Connection cn = ds.getConnection(); URq{#,~CT
多用于jsp中 HY.??
5MH
2、执行sql语句 L=u>}?!,Fj
1)用Statement来执行sql语句 UC)-Fd
String sql; T&Y?IE}
Statement sm = cn.createStatement(); 3_JxpQg
sm.executeQuery(sql); // 执行数据查询语句(select) E"e <9
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); $=/.oh
2)用PreparedStatement来执行sql语句 Hf
]aA_:
String sql; $0C1';=^}
sql = "insert into user (id,name) values (?,?)"; 8}FZ1h2
4
PreparedStatement ps = cn.prepareStatement(sql); Tz H*?bpP
ps.setInt(1,xxx); S.bB.<
ps.setString(2,xxx); 8S_i;
... 8v7;{4^
ResultSet rs = ps.executeQuery(); // 查询 2YD;Gb[8
int c = ps.executeUpdate(); // 更新 tl |Qw";I
Zk*/~f|\
3、处理执行结果 Cf'O*RFD
查询语句,返回记录集ResultSet =FkU:q$
更新语句,返回数字,表示该更新影响的记录数 $*ujX,}xG
ResultSet的方法 zT[[WY4
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ] 8sVXZ
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Ij_Y+Mnl4:
Suixk'-
4、释放连接 k\UDZ)TQV
cn.close(); >y%*HC!G
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection S&jZYq**
*xxG@h|5n
可滚动、更新的记录集 9IgozYj
1、创建可滚动、更新的Statement v%|^\A"V
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); v%(2l|M
该Statement取得的ResultSet就是可滚动的 `}/&}Sp
2、创建PreparedStatement时指定参数 VY)!bjW.
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); n22k<@y
ResultSet.absolute(9000); c!Gnd*!?-
批量更新 oR'8|~U@B
1、Statement R=jIVw'
Statement sm = cn.createStatement(); " >QNiR!
sm.addBatch(sql1); yDBS :
\
sm.addBatch(sql2); #<20vdc
... yk1syN_
sm.executeBatch() IKhpe5}
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 './j<2|;U
2、PreparedStatement qkpnXQ
PreparedStatement ps = cn.preparedStatement(sql); 0*S2_&Q)
{ 5I,5da
ps.setXXX(1,xxx); Np>[mNmga
... RkVU^N"
ps.addBatch(); P+!j[X^
} &K@2kq,
ps.executeBatch(); DN)Ehd.
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 SV;S`\i
f)x^s$H
事务的处理 ;h>s=D,r
1、关闭Connection的自动提交 (P
{o9
cn.setAutoCommit(false); V
QE *B
2、执行一系列sql语句 4R5+"h:
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close V:*QK,
Statement sm ; M#II,z>q
sm = cn.createStatement(insert into user...); 8YJ8_$Z
sm.executeUpdate(); qP<wf=wY
sm.close(); y#HDJ=2
sm = cn.createStatement("insert into corp...); \^9SuZ
sm.executeUpdate(); uop|8n1
sm.close(); f5jxF"oGNo
3、提交 Q70LQCms
cn.commit(); %\8E{M:
4、如果发生异常,那么回滚 x{IxS?.j+
cn.rollback();