java 数据库基本操作 FpA t
1、java数据库操作基本流程 iaeNY;T
2、几个常用的重要技巧: 80[# 6`
可滚动、更新的记录集 vk48&8
批量更新 Kw"y#Ys]
事务处理 #X?[")R
jYRSV7d
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 nW7: ]
1、取得数据库连接 bS r"k
1)用DriverManager取数据库连接 j9hfW'
例子 =2Yt[8';
String className,url,uid,pwd; YZ4`b-
className = "oracle.jdbc.driver.OracleDriver"; KGg
S"d
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; "g&f:[a/
uid = "system"; H~:oW~Ah
pwd = "manager"; -ZZJk-::
Class.forName(className); ?{J1Uw<
Connection cn = DriverManager.getConnection(url,uid,pwd); 4oiE@y&{4
2)用jndi(java的命名和目录服务)方式 GyN|beou
例子 c]aU}[s1
String jndi = "jdbc/db"; t~/:St
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ": M]3.
DataSource ds = (DataSource) ctx.lookup(jndi); pF-_yyQ
Connection cn = ds.getConnection(); sIgTSdk
多用于jsp中 ]B=*p0~j^n
2、执行sql语句 T:X*
1)用Statement来执行sql语句 O& Sk}^
String sql; $jE<n/8
Statement sm = cn.createStatement(); EOXkMr
sm.executeQuery(sql); // 执行数据查询语句(select)
<KU0K
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); hQm=9gS
2)用PreparedStatement来执行sql语句 0't)-Pj+,
String sql; =CK% Zo
sql = "insert into user (id,name) values (?,?)"; zdrP56rzZ
PreparedStatement ps = cn.prepareStatement(sql); D5@=#/?*
ps.setInt(1,xxx); ofQs
/
ps.setString(2,xxx); O0L]xr
... s)r!3HS
ResultSet rs = ps.executeQuery(); // 查询 Yz_}*
int c = ps.executeUpdate(); // 更新 x-CjxU3
B #%QY\<X
3、处理执行结果 )__sw
查询语句,返回记录集ResultSet l!88|~
更新语句,返回数字,表示该更新影响的记录数 u0&R*YV
ResultSet的方法 jc9C|r
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Xpg-rxX
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 .eD&UQ
)LFbz#;Y
4、释放连接 I!*P' {lh
cn.close(); ue@/o,C>
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 9S@x
#&Tm%CvB
可滚动、更新的记录集 |nx3x
1、创建可滚动、更新的Statement xz!0BG
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); w)+1^eW
该Statement取得的ResultSet就是可滚动的 xB Wl|j
2、创建PreparedStatement时指定参数 e72Fz#<q
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); @u9L+*F
ResultSet.absolute(9000); ?5nEmG|kO
批量更新 [S,$E6&j$"
1、Statement |w|c!;,
Statement sm = cn.createStatement(); pS+w4gW
sm.addBatch(sql1); ?;~E*kzO&
sm.addBatch(sql2); oLKliA=q
... M^:JhX{
sm.executeBatch() !\R5/-_UU
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 F,~BhKkbV
2、PreparedStatement
JHa1lj
PreparedStatement ps = cn.preparedStatement(sql); L.'61ZU
{ w gS'/
ps.setXXX(1,xxx); { im?tZ,
... V_J0I*Qa4
ps.addBatch(); &!X<F,
} HAK,z0/
ps.executeBatch(); ^t4^gcoZ4Z
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ';FJs&=I
wz`% (\
事务的处理 piM4grg
\
1、关闭Connection的自动提交 $TXiWW+
cn.setAutoCommit(false); |hika`35K
2、执行一系列sql语句 3 k/E$wOj
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close \[3~*eX6
Statement sm ; h6D4CT
sm = cn.createStatement(insert into user...); )mm0PJF~q
sm.executeUpdate(); _{k*JT2
sm.close(); >B0AJW/u
sm = cn.createStatement("insert into corp...); P".}Y[GD
sm.executeUpdate(); vK)'3%
sm.close(); Zo&i0%S\E
3、提交 i-v: %
cn.commit(); n<8WjrK
4、如果发生异常,那么回滚 =|E
"
cn.rollback();