java 数据库基本操作 SLh~_ 5
1、java数据库操作基本流程 2np-Fc{S
2、几个常用的重要技巧: SALCuo"L
可滚动、更新的记录集 .tp=T
批量更新 3@HIpQM3
事务处理 v=Mz I#0L
0UjyMEiK
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 8b~7~VCk
1、取得数据库连接 me$$he
1)用DriverManager取数据库连接 Wa/geQE1<
例子 (WMLNv
String className,url,uid,pwd; 8;.` {'r
className = "oracle.jdbc.driver.OracleDriver"; ?>TbTfmR
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; W_D%|Ub2X
uid = "system"; ,O9`X6rh'
pwd = "manager"; _w%s(dzk
Class.forName(className); vGyppm[0
Connection cn = DriverManager.getConnection(url,uid,pwd); dw99FA6
2)用jndi(java的命名和目录服务)方式 ULrbQ}"cva
例子 +1f{_v
String jndi = "jdbc/db"; :|fl?{E
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); U\;Ml
DataSource ds = (DataSource) ctx.lookup(jndi); 0k7"H]J
Connection cn = ds.getConnection(); 4sQ~&@[Q+
多用于jsp中 Oo$%Yh51~
2、执行sql语句 =ZrjK=K
1)用Statement来执行sql语句 bY&YSlO
String sql; 6(sfpK'
Statement sm = cn.createStatement(); bZnDd
sm.executeQuery(sql); // 执行数据查询语句(select) t5A[o7BS
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); wEv*1y4
2)用PreparedStatement来执行sql语句 $1=v.'Y
String sql; X)Ocn`|
sql = "insert into user (id,name) values (?,?)"; "pl[(rc+u
PreparedStatement ps = cn.prepareStatement(sql); :.C)7( 8S
ps.setInt(1,xxx); s'2y%E#
ps.setString(2,xxx); \O,j}O'
... 7TR'zW2W
ResultSet rs = ps.executeQuery(); // 查询 tUn&z?7bF
int c = ps.executeUpdate(); // 更新 v@]6<e$
LsUFz_
3、处理执行结果 C`z;,!58%
查询语句,返回记录集ResultSet P[6dTZ!\s
更新语句,返回数字,表示该更新影响的记录数 F^[M
ResultSet的方法 e4 ?<GT
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 8L@UB6b\
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 O]4W|WI3
fCs\Q
4、释放连接 }.w#X
cn.close(); E)RI!0Ra
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection *%z<P~}
(#CBq
可滚动、更新的记录集 +}`p"<'u
1、创建可滚动、更新的Statement / *Ou$
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); av7q>NEZ!1
该Statement取得的ResultSet就是可滚动的 l6yB_M
2、创建PreparedStatement时指定参数 /{49I,
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); o&*1U"6D
ResultSet.absolute(9000); H@Kl
批量更新 t=A E7
1、Statement }u38:(^`ai
Statement sm = cn.createStatement(); XtnIK
sm.addBatch(sql1); aEV|>K=6Y'
sm.addBatch(sql2); /5a$@%
... <x.]OZgO
sm.executeBatch() a-SB1-5jf
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 l;.[W|
2、PreparedStatement zDKLo 3:
PreparedStatement ps = cn.preparedStatement(sql); O1l4gduN|i
{ hXj* {vT
ps.setXXX(1,xxx); hCSRsk3
... ghE?8&@ iq
ps.addBatch(); *8pe<:A#p
} KzxW?Ji$S
ps.executeBatch(); KE }o
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 'Y,+D`&i)
\emT:Frb
事务的处理 UEx(~>
1、关闭Connection的自动提交 ;7B2~zL
cn.setAutoCommit(false); >Rx8 0
2、执行一系列sql语句 nvm1.}=Cnd
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close CfazD??x
Statement sm ; W]C_oh
sm = cn.createStatement(insert into user...); WzNG<rG
sm.executeUpdate(); od|N-R
sm.close(); WVBE>TB
sm = cn.createStatement("insert into corp...); ?eYchVq
sm.executeUpdate(); !>"INmz
sm.close(); +c~O0U1
3、提交 2-
|j
cn.commit(); u0(hVK`":
4、如果发生异常,那么回滚 {HE.mHy
cn.rollback();