java 数据库基本操作 f(h nomn
1、java数据库操作基本流程 9$ z|kwU
2、几个常用的重要技巧: |-HV@c]
可滚动、更新的记录集 D9;2w7v
批量更新 DJ)z~W2I*
事务处理 RN1q/H|
Bw31h3yB
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 rSUarfZ<
1、取得数据库连接 G 1rsd
1)用DriverManager取数据库连接 N;9m&)@JR'
例子 #-_';Er\
String className,url,uid,pwd; k|$08EK $
className = "oracle.jdbc.driver.OracleDriver"; >Q$, } `U;
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 4E`y*Hmzy+
uid = "system"; 3Ms`
ajJ
pwd = "manager"; +ou
]|
Class.forName(className); xm}9(EJ
Connection cn = DriverManager.getConnection(url,uid,pwd); KVVo_9S'
2)用jndi(java的命名和目录服务)方式 (3DjFT3
w
例子 Lbka*@
String jndi = "jdbc/db"; I6x
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); HWJ(O/N
DataSource ds = (DataSource) ctx.lookup(jndi); lw4#xH-?
Connection cn = ds.getConnection(); fWx
%?J
多用于jsp中 CfguL@tR.
2、执行sql语句 :esHtkyML
1)用Statement来执行sql语句 d;3/Vr$t=
String sql; 6q[|U_3I@
Statement sm = cn.createStatement(); (c X;a/BR
sm.executeQuery(sql); // 执行数据查询语句(select) k !S0-/h
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); <n4T*
2)用PreparedStatement来执行sql语句 S`oADy
String sql; O\h*?, )
sql = "insert into user (id,name) values (?,?)"; /Q4TQ\:
PreparedStatement ps = cn.prepareStatement(sql); (j^Qa~{mG4
ps.setInt(1,xxx); _;G. QwHr
ps.setString(2,xxx); #,0PLU3%
... *OOi
ResultSet rs = ps.executeQuery(); // 查询 +/tNd2
int c = ps.executeUpdate(); // 更新 @)A) cBv#
42a.@JbLQ
3、处理执行结果 j@xerY
查询语句,返回记录集ResultSet ]Q Y:t:-
更新语句,返回数字,表示该更新影响的记录数 IJxBPwh
ResultSet的方法 g\CRx^s
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ~C1lbn b
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 i`3h\ku
[Bn C_^[W
4、释放连接 UQ;ymTqdc
cn.close(); =.=4P~T&
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection V
_(L/6
9qUc{ydt
可滚动、更新的记录集 |H`}w2U[j
1、创建可滚动、更新的Statement "|?zQ?E
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); OOzk@j^
该Statement取得的ResultSet就是可滚动的 v=kQ/h
2、创建PreparedStatement时指定参数 :Ve>tZeW
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); :.863_/
ResultSet.absolute(9000); L|hdV\
批量更新 \K$9r=!(
1、Statement sN`2"t/s
Statement sm = cn.createStatement(); ke'aSD
sm.addBatch(sql1); |JZ3aS
sm.addBatch(sql2); v~f_~v5J!
... #k%$A}9
sm.executeBatch() &cDLSnR
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 /5qeNjI+2
2、PreparedStatement !~+"TI}_%w
PreparedStatement ps = cn.preparedStatement(sql); `SdvXn
{ Aofk< O!M
ps.setXXX(1,xxx); ftS^|%p
... S
VCTiG8t
ps.addBatch(); : +Na8\d
} snPM&
ps.executeBatch(); v6Vie o=
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ,$i2vGd
Gwyjie 9t
事务的处理 [D!-~]5
1、关闭Connection的自动提交 KIyhvY~
cn.setAutoCommit(false); Gk<M@d^hQ
2、执行一系列sql语句 h^yLmRL
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close =Q\z*.5j.
Statement sm ; Rra3)i`*
sm = cn.createStatement(insert into user...); %49P<vo`?
sm.executeUpdate(); %w+"MkH
_
sm.close(); c/:d$o-
sm = cn.createStatement("insert into corp...); ;DQ{6(
sm.executeUpdate(); >
-P UY
sm.close(); asDk@Gcu
3、提交 {y5v"GR{YM
cn.commit(); eIZ7uSl
4、如果发生异常,那么回滚 yQAW\0`
cn.rollback();