java 数据库基本操作 3fd?xhWbN
1、java数据库操作基本流程 s_4y^w]aX
2、几个常用的重要技巧: Ee097A?1vj
可滚动、更新的记录集 v!6IH
批量更新 F/w*[Xi
Sh
事务处理 v/[*Pze,C
Kw87 0n<
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 |h^]`= 3
1、取得数据库连接 >eucQ]
1)用DriverManager取数据库连接 ,HECHA_"
例子 a2SXg A
String className,url,uid,pwd; :]uz0s`>
className = "oracle.jdbc.driver.OracleDriver"; RI&V:1
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; K %.>o
uid = "system"; ++Fv )KY@
pwd = "manager"; /y[zOT6
Class.forName(className); ,ePl>m:Z
Connection cn = DriverManager.getConnection(url,uid,pwd); ?5<x$YI
2)用jndi(java的命名和目录服务)方式 M+GtUE~"
例子 F42?h:y8I
String jndi = "jdbc/db"; QQ\\:]iM
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); k<QZ_*x}G
DataSource ds = (DataSource) ctx.lookup(jndi); f?W" ^6Df
Connection cn = ds.getConnection(); 5KC
Zg'h
多用于jsp中 l
dw!G/
2、执行sql语句 W,bu=2K6
1)用Statement来执行sql语句 ,&iZ*6=X?0
String sql; ?F/)<r
Statement sm = cn.createStatement(); .kp3<.
sm.executeQuery(sql); // 执行数据查询语句(select) Kdr}7#c
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); IXC2w*'m
2)用PreparedStatement来执行sql语句 "] [u
String sql; i<-a-Z+^
sql = "insert into user (id,name) values (?,?)"; Hd89./v`:
PreparedStatement ps = cn.prepareStatement(sql); Mt\.?V:
ps.setInt(1,xxx); `9mc+
ps.setString(2,xxx); 3_N1y
... k~IRds@G
ResultSet rs = ps.executeQuery(); // 查询 [Y-3C47
int c = ps.executeUpdate(); // 更新 Z}yd`7
1BOv|xPjZ
3、处理执行结果 EFzPt?l
查询语句,返回记录集ResultSet 8)XAdAr
更新语句,返回数字,表示该更新影响的记录数
, )PpE&
ResultSet的方法 ;uN&yj<}a
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Zy=DY
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ]/{iIS_
V@pUU~6R
4、释放连接 nQ08(8
cn.close(); N4$ K{
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Ls/*&u
|u_fVQj
可滚动、更新的记录集 d5#z\E??
1、创建可滚动、更新的Statement &x)n K
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); >9,:i)m_
该Statement取得的ResultSet就是可滚动的 K8{ef
2、创建PreparedStatement时指定参数 ui<Mnm_T;d
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); y1#*c$ O
ResultSet.absolute(9000); sGO+O$J
批量更新 >oL| nwn
1、Statement VU;98
Statement sm = cn.createStatement(); 5`Y>!|
Ab
sm.addBatch(sql1); 46gDoSS
sm.addBatch(sql2); u-@;Q<v$
... NS){D7T
sm.executeBatch() z C7 b
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 7}puj%JS
/
2、PreparedStatement tu6<>
PreparedStatement ps = cn.preparedStatement(sql); <6.?:Jj
{ 4P}d/w?'KL
ps.setXXX(1,xxx); y/;DA=
... dZuPR
ps.addBatch(); ~WKWx.ul
} Q& S 7_
ps.executeBatch(); ]e(\<R6Gf
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 <$Djags,F
kJpr:4;@_
事务的处理 UL]zuW/
1、关闭Connection的自动提交 }gKY_e3
cn.setAutoCommit(false); Xa_:B\ic
2、执行一系列sql语句 3u/ GrsF
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ?^WX]SAl
Statement sm ; ;^cMP1SH
sm = cn.createStatement(insert into user...); wQ?Z y;/S
sm.executeUpdate(); J+l#!gk$!
sm.close(); G6p R?K+
sm = cn.createStatement("insert into corp...); dpcU`$kt
sm.executeUpdate(); : eFyd`Syw
sm.close(); ~~}8D"
3、提交 ]T._TZ"
cn.commit(); &neB$m3y
4、如果发生异常,那么回滚 {m/KD 'b_
cn.rollback();