java 数据库基本操作 J]=2] oI2
1、java数据库操作基本流程 I8]q~Q<-P
2、几个常用的重要技巧: ;^cc-bLvF
可滚动、更新的记录集 tG"lI/
批量更新 ,VTX7vaH
事务处理 1r-#QuV#
?->&)oAh
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 (8?5REz
1、取得数据库连接 ap%
Y}
1)用DriverManager取数据库连接 FhyA_U%/nF
例子 MY$-D+#/`
String className,url,uid,pwd; GSh~j-C'
className = "oracle.jdbc.driver.OracleDriver"; G"'[dL)N>
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; b#2$Pd:(
uid = "system"; ?xgrr7
pwd = "manager"; ?t{ 2y1
Class.forName(className); nRL2Z5iO-
Connection cn = DriverManager.getConnection(url,uid,pwd); ^9zFAY.|
2)用jndi(java的命名和目录服务)方式 "k%B;!We)
例子 mEM/}]2
String jndi = "jdbc/db"; /j`vN
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); nP+]WUnY
DataSource ds = (DataSource) ctx.lookup(jndi); >FRJvZ6
Connection cn = ds.getConnection(); 0k7kmDW
多用于jsp中 .!&S{;Vv?W
2、执行sql语句 VSJ08Ngi
1)用Statement来执行sql语句 ,svj(HP$
String sql; nGdEJ
Statement sm = cn.createStatement(); \XUG-\$p
sm.executeQuery(sql); // 执行数据查询语句(select) *Pmk1h2
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); o3oAk10
2)用PreparedStatement来执行sql语句 V`7^v:
String sql; 4XprVB
sql = "insert into user (id,name) values (?,?)"; 9j6
PreparedStatement ps = cn.prepareStatement(sql); V L&5TZtz
ps.setInt(1,xxx); 2\:z
ps.setString(2,xxx); YyZ>w2_MTi
...
7z?rx
ResultSet rs = ps.executeQuery(); // 查询 \s[/{3
int c = ps.executeUpdate(); // 更新 M-B -
{m&8Viq1
3、处理执行结果 ~D9VjXfL)
查询语句,返回记录集ResultSet i7m=V T
更新语句,返回数字,表示该更新影响的记录数 J6)&b7
ResultSet的方法 M]Y72K^
1、next(),将游标往后移动一行,如果成功返回true;否则返回false qU1^ K
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 M_4:~&N$
8w[nY.#T
4、释放连接 (;11xu
cn.close(); --~m{qmy
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection -C7IUat<
l u^fKQ
可滚动、更新的记录集 3>`CZ]ip}
1、创建可滚动、更新的Statement jmAQ!y|W.
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 3gn)q>Xj$
该Statement取得的ResultSet就是可滚动的 QqC4g]
2、创建PreparedStatement时指定参数 LE|*Je3a
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); CulU?-[i
ResultSet.absolute(9000); \I"UW1)B
批量更新 `xhiG9mz~
1、Statement Au6*hv3:
Statement sm = cn.createStatement(); B~_='0Gm[
sm.addBatch(sql1); 4<['%7U_[
sm.addBatch(sql2);
.3B3Z&vr
... (X
rrnoz
sm.executeBatch() @[qGoai
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Ch1+YZG
2、PreparedStatement nC3U%*l
PreparedStatement ps = cn.preparedStatement(sql); hm%'k~
{ R?Dbv'lp>
ps.setXXX(1,xxx); UH<nc;.B
... U#O6l-xe]
ps.addBatch(); 0.}Um
} iI[Z|"a 21
ps.executeBatch(); 0x}8}
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 IX7|_ci
r@xMb,!H
事务的处理 y&0&K4aa
1、关闭Connection的自动提交 rAdYBr=0
cn.setAutoCommit(false); gc:qqJi)X
2、执行一系列sql语句 62B` Z5j#
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close IED7v
Statement sm ; Hp_3BulS<
sm = cn.createStatement(insert into user...); ZhKYoPIq
sm.executeUpdate(); x@F"ZiYD@O
sm.close(); ,Ty>sZ#/fz
sm = cn.createStatement("insert into corp...); uc?QS~H&w
sm.executeUpdate(); >Au]S`
sm.close(); "HW~|M7>(
3、提交 C#X0Cn0ln
cn.commit(); =KwG;25hX
4、如果发生异常,那么回滚 9n!<M)E
cn.rollback();