java 数据库基本操作 YsVmU
1、java数据库操作基本流程 p"ZvA^d\
2、几个常用的重要技巧: CUu
Owx6%
可滚动、更新的记录集 4XjwU`
批量更新 f+cb83}n]
事务处理 QxYm3x5
|Vx[
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 'f\9'v
1、取得数据库连接 g"m'
C6;
1)用DriverManager取数据库连接 Zv;nY7B
例子 fp' '+R[
String className,url,uid,pwd; {EoYU\x
className = "oracle.jdbc.driver.OracleDriver"; nK1eh@a9Qv
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 0K%okq|n
uid = "system"; u7L?9
pwd = "manager"; dLiiJ6pl*
Class.forName(className); mWT+15\5r(
Connection cn = DriverManager.getConnection(url,uid,pwd); o5o myMN
2)用jndi(java的命名和目录服务)方式 )@NFV*@I
例子 i1vz{Tc
String jndi = "jdbc/db"; 6]brL.eGj
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); MXaFqK<Y
DataSource ds = (DataSource) ctx.lookup(jndi); ,|A^ <R`
Connection cn = ds.getConnection(); q]?qeF[
多用于jsp中 1K#>^!?M
2、执行sql语句 ^wIB;!W
1)用Statement来执行sql语句 nR{<xD^
String sql; atTR6%!6
Statement sm = cn.createStatement(); L 4j#0I]lq
sm.executeQuery(sql); // 执行数据查询语句(select) "cKD#
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ~T_|?lU`R
2)用PreparedStatement来执行sql语句 M\R+:O&
String sql; |]?f6^|4
sql = "insert into user (id,name) values (?,?)"; F1#{(uW
PreparedStatement ps = cn.prepareStatement(sql); T+Z[&|
ps.setInt(1,xxx); J4T"O<i$58
ps.setString(2,xxx); I%5vI}
... t*IePz] /
ResultSet rs = ps.executeQuery(); // 查询 Lh[0B.g<
int c = ps.executeUpdate(); // 更新 u cpU$+
w2
Y%yjCV
3、处理执行结果 |Ea%nghl
查询语句,返回记录集ResultSet & FhJ%JK
更新语句,返回数字,表示该更新影响的记录数 d%7?913
ResultSet的方法 FK^xZ?G
1、next(),将游标往后移动一行,如果成功返回true;否则返回false FRQ.ix2
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 {-4+=7Sg1
xt^1,V4Ei~
4、释放连接 ?Q"andf
cn.close(); 6$urrSQ`N0
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection D$}hoM1
X30tO>
可滚动、更新的记录集 m_)-
1、创建可滚动、更新的Statement wN[lC|1c
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); #X-C~*|>j
该Statement取得的ResultSet就是可滚动的 dn
6]qW5
2、创建PreparedStatement时指定参数 7{m>W!
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 3``JrkPI
ResultSet.absolute(9000); :uCwWv
批量更新 EO !,rB7I
1、Statement w6vbYPCN
Statement sm = cn.createStatement(); KuJ)alD;1
sm.addBatch(sql1); h4`8C]
sm.addBatch(sql2);
S_P&Fv
... rCPIz<
sm.executeBatch() %'KRbY
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 \?n6l7*t>
2、PreparedStatement Nc\DXc-N
PreparedStatement ps = cn.preparedStatement(sql); *Jsb~wta
{ k{ qxsNM
ps.setXXX(1,xxx); ,Cr%2Wg-
... $s7U
|F,I
ps.addBatch(); >Sc yc-n
} t%qep|
ps.executeBatch(); =yod
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Qt.*Z;Gs
s5*4<VxQN.
事务的处理 spa:5]B
1、关闭Connection的自动提交 6e ?xu8|
cn.setAutoCommit(false); ED` 1)1<
2、执行一系列sql语句 7KIekL
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close P]Fb0X
Statement sm ; >=N-P<%
sm = cn.createStatement(insert into user...); DT]4C!dh
sm.executeUpdate(); RL`E}:V
sm.close(); 8jz>^.-o
sm = cn.createStatement("insert into corp...); 'zUV(K?2]
sm.executeUpdate(); cEL:5*cAU}
sm.close(); ?}?"m:=
3、提交 ]9YA~n\
cn.commit(); u>
{aF{
4、如果发生异常,那么回滚 :E")Zw&sW3
cn.rollback();