java 数据库基本操作 9lXjB_wG>
1、java数据库操作基本流程 ', +YWlW
2、几个常用的重要技巧: T<XGG_NOl
可滚动、更新的记录集 8k[=$Ro
批量更新 8[v9|r
事务处理 y950Q%B]
{o>51fXc)
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 b^s978qn#
1、取得数据库连接 >I*)0tE
1)用DriverManager取数据库连接 ={g.Fn(_
例子 nUb0R~wr$G
String className,url,uid,pwd; w1;:B%!H
className = "oracle.jdbc.driver.OracleDriver"; *~Y$8!ad
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; z3-A2#c
uid = "system"; O2;iY_P7lV
pwd = "manager"; hSkI]%
Class.forName(className); /Uxp5 b h
Connection cn = DriverManager.getConnection(url,uid,pwd); G42J
2)用jndi(java的命名和目录服务)方式 B8Vhl:p
例子 )WWqi,T}
String jndi = "jdbc/db"; SfTTB'9
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 3(o}ulp
DataSource ds = (DataSource) ctx.lookup(jndi); 7 +]+S`p
Connection cn = ds.getConnection(); K<3,=gL9[
多用于jsp中 iEx
sGn]2
2、执行sql语句
]F'o
1)用Statement来执行sql语句 vC#_PI
String sql; fl@=h[g#t
Statement sm = cn.createStatement(); x)}.@\&%
sm.executeQuery(sql); // 执行数据查询语句(select) )\aCeY8o
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ce56$L8[
2)用PreparedStatement来执行sql语句 7l%]O}!d)
String sql; 1 sJtkge:
sql = "insert into user (id,name) values (?,?)"; wmV7g7t6
PreparedStatement ps = cn.prepareStatement(sql); meF.`fh
ps.setInt(1,xxx); ,]Gi942
ps.setString(2,xxx); };{Qx
... Th.Mn}1%L
ResultSet rs = ps.executeQuery(); // 查询 RKi11z
int c = ps.executeUpdate(); // 更新
eeMeV>
sOVbz2\yb
3、处理执行结果 ;15j\{r
查询语句,返回记录集ResultSet TKH!,Ow9A
更新语句,返回数字,表示该更新影响的记录数 %>io$ o
ResultSet的方法 L.ML0H-
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ^WF/gup\hS
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Q$bi:EyJXc
I@/s&$H`l
4、释放连接 Sgp1p}
cn.close(); hnYL<<AA
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection r'F)8%
/`kM0=MMa
可滚动、更新的记录集 {D{'
\]+
1、创建可滚动、更新的Statement 18eB\4NlD
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 9B)<7JJX!J
该Statement取得的ResultSet就是可滚动的 (_0r'{`
2、创建PreparedStatement时指定参数 e'l@M$^
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ZbAg^2
ResultSet.absolute(9000); (/i?Fd
批量更新 C<B+! 16
1、Statement PKjM1wqaG@
Statement sm = cn.createStatement(); H@uDP
sm.addBatch(sql1); /gH[|d
sm.addBatch(sql2); %|izt/B
... DS|HN
sm.executeBatch() XG!s+ShFV
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 :aHLr[%Mz
2、PreparedStatement TC* 78;r
PreparedStatement ps = cn.preparedStatement(sql); >OxSrc@A
{ ).$q9G
ps.setXXX(1,xxx); ;h~v,h
... EP'I
ps.addBatch(); ']&rPvkL
} zz m[sX}
ps.executeBatch(); dbsD\\,2%N
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 <|=^[' vi
h uIvXl
事务的处理 ^'G,sZ6'Nh
1、关闭Connection的自动提交 $S'~UbmYU
cn.setAutoCommit(false); Dg=!d)\
2、执行一系列sql语句 u*6Y>_iA
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close umuE5MKY<
Statement sm ; $! R]!s
sm = cn.createStatement(insert into user...); B:]%Iu|
sm.executeUpdate(); PZ.q
sm.close(); WKvG|YRDq
sm = cn.createStatement("insert into corp...); zL@FN sYVM
sm.executeUpdate(); "i^<
H
sm.close(); O<>cuW(l
3、提交 &_dM2lj{
cn.commit(); #I9hKS{
4、如果发生异常,那么回滚 #qDMUN*i
cn.rollback();