java 数据库基本操作 mEd2f^R
1、java数据库操作基本流程 y ;[~(Yg[
2、几个常用的重要技巧: js81@WX!c
可滚动、更新的记录集 H
u;"TG
批量更新 hXjZ>n``
事务处理 Z\CvaX
Ie.
on )
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 fasWb&~z
1、取得数据库连接 +112{v=!i
1)用DriverManager取数据库连接 ]64}Xob87_
例子 B~KxUp
String className,url,uid,pwd; ?/3wO/7[
className = "oracle.jdbc.driver.OracleDriver"; W|>jj$/o
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; QLO;D)fC
uid = "system"; B&a{,.m&q6
pwd = "manager"; FFcCoPX_
Class.forName(className); Z2$_9.
Connection cn = DriverManager.getConnection(url,uid,pwd);
`;6M|5G
2)用jndi(java的命名和目录服务)方式 ?CQE6ch
例子 _f%s]
String jndi = "jdbc/db"; /@ @F
nQ++
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); M
co:eE
DataSource ds = (DataSource) ctx.lookup(jndi); v zg^tJ
Connection cn = ds.getConnection(); Hloe7+5UD
多用于jsp中 ^}-l["u`
2、执行sql语句 cRnDAn#42
1)用Statement来执行sql语句 KNAvLcg
String sql; dRron_'
Statement sm = cn.createStatement(); Jj
\nye+
sm.executeQuery(sql); // 执行数据查询语句(select) hUlRtt
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); _ Lh0
2)用PreparedStatement来执行sql语句 _C/|<Ot:
String sql; M?h{'$T
sql = "insert into user (id,name) values (?,?)"; G7 UUx+ X
PreparedStatement ps = cn.prepareStatement(sql); ['}|#3*w
ps.setInt(1,xxx); ML12&E>
ps.setString(2,xxx); |KYl'"5\
... kzZgNv#G;
ResultSet rs = ps.executeQuery(); // 查询 :.+w'SEn4M
int c = ps.executeUpdate(); // 更新 {:gx*4}q8
HqWWWCWal
3、处理执行结果 Zmyq6.1q~
查询语句,返回记录集ResultSet kS-BB[T
更新语句,返回数字,表示该更新影响的记录数 I_ZJnu<
ResultSet的方法 w"9h_;'C_
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Z5q%L!4G
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ~JL
qh
k={D!4kKz
4、释放连接 3HrG^/
cn.close(); oWY3dc
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection .jQx2O
lm4A%4-db
可滚动、更新的记录集 'r!!W0-K
1、创建可滚动、更新的Statement W/2y;@
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ]vQa~}
该Statement取得的ResultSet就是可滚动的 _R\FB|_
2、创建PreparedStatement时指定参数 ?C2(q6X+s
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ,"`20.Lv
ResultSet.absolute(9000); E D>7
批量更新 5<(*
+mP`
1、Statement w PR Ns9^
Statement sm = cn.createStatement(); LLTr+@lj
sm.addBatch(sql1); QPf\lN/$4d
sm.addBatch(sql2); _;PQt" ]
... !}*vM@)1
sm.executeBatch() 1-p#}VX
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 SSF:PTeG>
2、PreparedStatement i`sZP#h
PreparedStatement ps = cn.preparedStatement(sql); M$EF 8
{ wMCMrv:
ps.setXXX(1,xxx); F7=9> ,
... s1_Y~<yX
ps.addBatch(); l\{Qnb(
} j>JBZ#g
ps.executeBatch(); ~},H+A!?
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 */K[B(G
2`]c&k;]
事务的处理 DIGw4g4Kt
1、关闭Connection的自动提交 (>0`e8v!
cn.setAutoCommit(false); zdJPMNHg
2、执行一系列sql语句 [6VM4l"
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close N#M>2b<A/T
Statement sm ; _]*[TGap
sm = cn.createStatement(insert into user...); q,fp
DNo
sm.executeUpdate(); z\tY A
sm.close(); [Z/P[370
sm = cn.createStatement("insert into corp...); h's[)
t
sm.executeUpdate(); xCL)<8[R,}
sm.close(); =M
8Mt/P
3、提交 ;*qXjv&
K
cn.commit(); v>K|hH
4、如果发生异常,那么回滚 ;0WAfu}#H
cn.rollback();