java 数据库基本操作 cW|Zgz8vv
1、java数据库操作基本流程 lJQl$Wx^
2、几个常用的重要技巧: snzH}$Ls
可滚动、更新的记录集 WMz|FFKVY
批量更新 1B]wSvP@
事务处理 d.(]V2X.J
=d4',[O
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 }6{ )Jv
1、取得数据库连接 q>l kLHS
1)用DriverManager取数据库连接 FZ.Yn
例子 !rmo*-=^=
String className,url,uid,pwd; T[9jTO?W2
className = "oracle.jdbc.driver.OracleDriver"; 2i'-lM=
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; btz3f9
uid = "system"; +O:pZz
pwd = "manager"; +#"Ic:
Class.forName(className); (V%vFD1)
Connection cn = DriverManager.getConnection(url,uid,pwd); X!HSS/'
2)用jndi(java的命名和目录服务)方式 w
I
7
例子 ,7nb;$]
String jndi = "jdbc/db"; *E q7r>[
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 3K]0sr
DataSource ds = (DataSource) ctx.lookup(jndi); zgOwSg8
Connection cn = ds.getConnection(); b0CaoSWo
多用于jsp中 u^.k"46hn
2、执行sql语句 <T~fh>a
1)用Statement来执行sql语句 RpXG gw
String sql; &XTd[_VW!
Statement sm = cn.createStatement(); EC\:uK
sm.executeQuery(sql); // 执行数据查询语句(select) gK_[3FiKt
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); b6M)qt9R
2)用PreparedStatement来执行sql语句 K]Cs2IpI
String sql; iK0J{'
sql = "insert into user (id,name) values (?,?)"; >bP7}T
PreparedStatement ps = cn.prepareStatement(sql); a_MnQ@
ps.setInt(1,xxx); +uXnFf d^
ps.setString(2,xxx); "JGig!9
... +GtGyp
ResultSet rs = ps.executeQuery(); // 查询 \B+SzW
int c = ps.executeUpdate(); // 更新 `fh_8%m]*
gM[
J'DMW
3、处理执行结果 _@?Jx/`;bk
查询语句,返回记录集ResultSet 03\8e?$
更新语句,返回数字,表示该更新影响的记录数 5Kxk9{\8
ResultSet的方法 rSCX$ @@F
1、next(),将游标往后移动一行,如果成功返回true;否则返回false `%:(IGxz
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Yzx0 [_'u
4T\/wyq0
4、释放连接 ^u&Khc~
y
cn.close(); T}x%=4<E
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection k"-#ox!
eC:Q)%$%l
可滚动、更新的记录集 2G>
]W?>
1、创建可滚动、更新的Statement xJ5!`#=
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); k(Xv&Zn
该Statement取得的ResultSet就是可滚动的 5!fW&OiY
2、创建PreparedStatement时指定参数 vyy\^nL
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); SytDo (_=W
ResultSet.absolute(9000); &Y2P! \\2
批量更新 -zkL)<7
1、Statement l:}4
6%
Statement sm = cn.createStatement(); -%$
dFq
sm.addBatch(sql1); OvG |=
sm.addBatch(sql2); Pt;Ahmi
... RIx6& 7$
sm.executeBatch() iFchD\E*o
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ()JDjzQT
2、PreparedStatement k}qiIMdI
PreparedStatement ps = cn.preparedStatement(sql); hvZR4|k>
{ CUcjJ|MZ
ps.setXXX(1,xxx); %E_{L
... @y&,e,3!
ps.addBatch(); =x]dP.
} rs+37
ps.executeBatch(); IcA~f@
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 eZ$1|Sj]j
{-qTU6
事务的处理 \,t<{p_Q
1、关闭Connection的自动提交 xGk4KcxKs
cn.setAutoCommit(false); H43D=N&
2、执行一系列sql语句 /a)=B)NH
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Xh!Pg)|E
Statement sm ; GQWTQIl]
sm = cn.createStatement(insert into user...); wajhFBJ
sm.executeUpdate(); ?"u-@E[m
sm.close(); Ux]@prA q
sm = cn.createStatement("insert into corp...); S*:w\nXP~
sm.executeUpdate();
>ON.ftZi
sm.close(); ]iX$p~riH
3、提交 Rj=Om
cn.commit(); _@76eZd
4、如果发生异常,那么回滚 j)*nE./3
cn.rollback();