java 数据库基本操作 ]}cai1
1、java数据库操作基本流程 9LGJ -gL
2、几个常用的重要技巧: n}qHt0N
可滚动、更新的记录集 KD^>Vv#
批量更新 ]+W+8)f1M
事务处理 QH6Lb%]/
85l 1
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Pt?]JJxl-
1、取得数据库连接 DEaO=p|
1)用DriverManager取数据库连接 *lg1iP{]
例子 Zg|z\VR
String className,url,uid,pwd; %,GY&hTw
className = "oracle.jdbc.driver.OracleDriver"; rO/mK$
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; >'/G:\M>A
uid = "system"; k=O2s'F`
pwd = "manager"; G|yX9C]R
Class.forName(className); Mu18s}
Connection cn = DriverManager.getConnection(url,uid,pwd); 3mgFouX2x,
2)用jndi(java的命名和目录服务)方式 "';'*x
例子 zqqpBwk#
String jndi = "jdbc/db"; 5,'?NEyw
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); [SgP1>M
DataSource ds = (DataSource) ctx.lookup(jndi); r:y*l4
Connection cn = ds.getConnection(); 86~HkHliv
多用于jsp中 /!UuGm
2、执行sql语句 phUno2fH
1)用Statement来执行sql语句 UnZ*"%
String sql; }.7!@!q.
Statement sm = cn.createStatement(); (
=->rP
sm.executeQuery(sql); // 执行数据查询语句(select) PEoOs
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); y>u+.z a|
2)用PreparedStatement来执行sql语句 gy _86y@
String sql; ~-Rr[O=E
sql = "insert into user (id,name) values (?,?)"; V#|#%
8
PreparedStatement ps = cn.prepareStatement(sql); R)t"`'6|
ps.setInt(1,xxx); dZRz'd
ps.setString(2,xxx); f
5_n2
... L._I"g5 H9
ResultSet rs = ps.executeQuery(); // 查询 J
/'woc
int c = ps.executeUpdate(); // 更新 q,2]]K7y
<FMW%4
3、处理执行结果 B} gi /
查询语句,返回记录集ResultSet X4&{/;$
更新语句,返回数字,表示该更新影响的记录数 y yrCO"eh
ResultSet的方法 0^|)[2m!
1、next(),将游标往后移动一行,如果成功返回true;否则返回false )__vPPko i
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 F$ x@]
&Hc8u,|
4、释放连接 bc5+}&W
cn.close(); ";9cYoKRY
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection +}>whyX1
?{$Q'c_I
可滚动、更新的记录集 yEtSyb~GK
1、创建可滚动、更新的Statement U}6'_ PRQ
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); /9|1eSUa
该Statement取得的ResultSet就是可滚动的 )dG7$,g
2、创建PreparedStatement时指定参数 ,m!j2H}8
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); R*E/E
ResultSet.absolute(9000); H]Q Z4(
批量更新 \rcbt6H
1、Statement 6J6MR<5'
Statement sm = cn.createStatement(); {LY$
sm.addBatch(sql1); >ALU}o/
sm.addBatch(sql2); zrE
~%YR
... lKI1bs]i
sm.executeBatch() 6CLrP}
u
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 95aa
2、PreparedStatement J:'cj5@
PreparedStatement ps = cn.preparedStatement(sql); WO)rJr!C
{ 6t
TLyI$+
ps.setXXX(1,xxx); tk<dp7y7
... 3ZU`}
ps.addBatch(); Z~~{!C+G
} DL|,:2`
ps.executeBatch(); A(W%G|+
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 <dD}4c+/t
~kYUp5f
事务的处理 ?BQZ\SXU
1、关闭Connection的自动提交 X7{ueP#L
cn.setAutoCommit(false); Q4TI '/
2、执行一系列sql语句 EkEM|<GNd
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close AASw^A3p
Statement sm ; z*YkD"]B
sm = cn.createStatement(insert into user...); NUEy0pLw
sm.executeUpdate(); OTL=(k
sm.close(); 5Qo\0YH
sm = cn.createStatement("insert into corp...); ~LuZpV
sm.executeUpdate(); $f*N
sm.close(); $=4T# W=m
3、提交 nu}$wLM
cn.commit(); PNd]Xmv)
4、如果发生异常,那么回滚 O!lZ%j@%
cn.rollback();