java 数据库基本操作 ?C- ju8]|
1、java数据库操作基本流程 `X)A$lLr
2、几个常用的重要技巧: [b_qC'K[
可滚动、更新的记录集 o+.ySSBl+
批量更新 `F]
事务处理 pXvys]@
nSRNd
A
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 |o+*Iy)
1、取得数据库连接 b
0qA
1)用DriverManager取数据库连接 [H{@<*
例子 mZM,"Wq,
String className,url,uid,pwd; Kr[oP3
className = "oracle.jdbc.driver.OracleDriver"; s4QCun~m
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; )%PMDG|
uid = "system"; {pA&Q{ ^
pwd = "manager"; mi.,Z`]o
Class.forName(className); @;x*~0GZ
Connection cn = DriverManager.getConnection(url,uid,pwd); 0X4)=sJP
2)用jndi(java的命名和目录服务)方式 7&9w_iCkV
例子 slhMvHOk-
String jndi = "jdbc/db"; ~KV{m
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); *nc3A[B#C
DataSource ds = (DataSource) ctx.lookup(jndi); f'w`<
Connection cn = ds.getConnection(); {> <1K6t
多用于jsp中 7XLqP
2、执行sql语句 rxqSi0p
1)用Statement来执行sql语句 .6C6ZUB;
String sql; _]- 4UA-
Statement sm = cn.createStatement(); I9Uj3cL\
sm.executeQuery(sql); // 执行数据查询语句(select) G&@dJ &B
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); QBG jH^kL
2)用PreparedStatement来执行sql语句 I ~^Xw7
String sql; !XM<`H/
sql = "insert into user (id,name) values (?,?)"; uE<8L(*B
PreparedStatement ps = cn.prepareStatement(sql); ^B%c3U$o
ps.setInt(1,xxx); g"k4Z
ps.setString(2,xxx); B:Ft(,
... a
9{:ot8,
ResultSet rs = ps.executeQuery(); // 查询 _aBy>=2c$
int c = ps.executeUpdate(); // 更新 u!&T}i:
5423Ky<
3、处理执行结果 wlsx|
查询语句,返回记录集ResultSet ;^u,[d
更新语句,返回数字,表示该更新影响的记录数 _C(fz CK
ResultSet的方法 :U *8S\$
1、next(),将游标往后移动一行,如果成功返回true;否则返回false n#}~/\P6
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ^#Mp@HK
N/ '
4、释放连接 .ZV='i()X
cn.close(); j S[#R_
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection fVf:voh
q
|FOU
可滚动、更新的记录集 wy8Q=X:vP
1、创建可滚动、更新的Statement NbTaI{r
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); V.*y_=i8t
该Statement取得的ResultSet就是可滚动的 w%plK6:6
2、创建PreparedStatement时指定参数 Tl'wA^~H
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); aSu^
ResultSet.absolute(9000); LnKgT1
批量更新 Aj=GekX{
1、Statement !h|,wq]k
Statement sm = cn.createStatement(); /-i m
g^^
sm.addBatch(sql1); ivn2
sm.addBatch(sql2); x0jaTlU/
... !icI Rqcf=
sm.executeBatch() w-2#CX8jY
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 PTLlLa85<
2、PreparedStatement fQ~TZ:UrU
PreparedStatement ps = cn.preparedStatement(sql); TnKv)%VF
{ ?QzL#iO}h
ps.setXXX(1,xxx); +/l@ou'
... _hJdC|/
ps.addBatch(); 9P)!v.,T/
} g1}:;VG=
ps.executeBatch(); 'RhS%l
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Jwfb%Xge~
%8h=_(X\7
事务的处理 M:/(~X{?
1、关闭Connection的自动提交 S9]I[4
cn.setAutoCommit(false); |m6rF7Q
2、执行一系列sql语句 cm_5,wB(w
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close &P>& T
Statement sm ; !02y'JS1
sm = cn.createStatement(insert into user...); F[SZwMf29
sm.executeUpdate(); xr]bH.>
sm.close(); :Yn.Wv-
sm = cn.createStatement("insert into corp...); 6i~|<vcSP
sm.executeUpdate(); /9&!u )+
sm.close(); l@*$C&E
3、提交 :"Otsb7
cn.commit(); F'OO{nF
4、如果发生异常,那么回滚 o $W@@aM
cn.rollback();