java 数据库基本操作 RTYhgq
1、java数据库操作基本流程 |R>I#NO5
2、几个常用的重要技巧: h!1CsLd[
可滚动、更新的记录集 K/LoHWy+n*
批量更新 jF%l\$)/
事务处理 Jz)c|8U
`L"{sW6S
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ZQDw|*a@
1、取得数据库连接 y7#vH<
1)用DriverManager取数据库连接 y &%2
例子 dRLvej,
String className,url,uid,pwd; 0bG2YMs
className = "oracle.jdbc.driver.OracleDriver"; xw rleB
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; r/6h}
uid = "system"; tJ9`Ys
pwd = "manager"; >l!DWi6
Class.forName(className); 2<+9lk
Connection cn = DriverManager.getConnection(url,uid,pwd); 2a:JtJLl
2)用jndi(java的命名和目录服务)方式 CFx$r_!~
例子 :WdiH)Zv
String jndi = "jdbc/db"; W_G'wU3R
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); lmr:PX
DataSource ds = (DataSource) ctx.lookup(jndi); ESv&x6H
Connection cn = ds.getConnection(); wz5*?[4
多用于jsp中 0t}&32lL&
2、执行sql语句 8Vqh1<
1)用Statement来执行sql语句 KfLp cV
String sql; WUqfY?5
Statement sm = cn.createStatement(); )WazbT@
sm.executeQuery(sql); // 执行数据查询语句(select) XDq*nA8#5B
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); l050n9#9p
2)用PreparedStatement来执行sql语句 Kg;1%J>ee
String sql; *.Ceb%W7C
sql = "insert into user (id,name) values (?,?)"; {KalVZX2R
PreparedStatement ps = cn.prepareStatement(sql); fwi(qx1=}
ps.setInt(1,xxx); EXYr_$gRs
ps.setString(2,xxx); W%cJ#R[o
... g"L$}#iTsl
ResultSet rs = ps.executeQuery(); // 查询 HWT^u$a"
int c = ps.executeUpdate(); // 更新 XqTDLM&
|0/~7l
3、处理执行结果 =
eDi8A*~
查询语句,返回记录集ResultSet ]Syr{|
更新语句,返回数字,表示该更新影响的记录数 AIFI@#3
ResultSet的方法 /0qLMlL$
1、next(),将游标往后移动一行,如果成功返回true;否则返回false B@2VI
1%
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 >~k"C,6
YV>]c9!q
4、释放连接 X
Sw0t8
cn.close(); 2N:|B O>
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection cp>1b8l6?
Q'S"$^~{
可滚动、更新的记录集 k\a&4v
1、创建可滚动、更新的Statement JA~v:ec
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); X,8]g.<
该Statement取得的ResultSet就是可滚动的 :;]iUjiC8
2、创建PreparedStatement时指定参数 cfd7)(6
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); P>3
;M'KsO
ResultSet.absolute(9000); /a!M6:,pX
批量更新 0?
QTi(
1、Statement nB1[OB{
Statement sm = cn.createStatement(); ,P9q[
sm.addBatch(sql1); S(
r Fa
sm.addBatch(sql2); u4a(AB>S
... 8/dx)*JCq
sm.executeBatch() qE&R.I!o
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 4R/cN'-
2、PreparedStatement "?UBW5nM#
PreparedStatement ps = cn.preparedStatement(sql); fSFb)+
{ g",htYoEnj
ps.setXXX(1,xxx); [~<X|_LG
... |B;tv#mKD
ps.addBatch(); :v!e8kM\x
} 9I;d>%
ps.executeBatch(); .`3O4]N[
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ==\Qj{
7`
u
6(O;
事务的处理 yy%'9E ldc
1、关闭Connection的自动提交 C.[abpc
cn.setAutoCommit(false); _c4kj
2、执行一系列sql语句 93*MY7j}
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close (/r l\I
Statement sm ; JXIxk"m
sm = cn.createStatement(insert into user...); O+^l>+ZGj?
sm.executeUpdate(); cn$o$:tW
sm.close(); RHc-kggk!
sm = cn.createStatement("insert into corp...); V94eUmx>?+
sm.executeUpdate(); d/O~"d
sm.close(); YxUC.2V|7$
3、提交 x$;I E
cn.commit(); _Fz]QxO
4、如果发生异常,那么回滚 7xIXFuu
cn.rollback();