java 数据库基本操作 &8Vh3QLEx
1、java数据库操作基本流程 |Z2_W/
2、几个常用的重要技巧: "(p /3qFY
可滚动、更新的记录集 `$FX%p
批量更新 He4HIZ
事务处理 "nfi:A1
]+a~/
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 LEtGrA/%@b
1、取得数据库连接 X(Mpg[,N"
1)用DriverManager取数据库连接 ')yYpWO
例子 oq,nfUA
String className,url,uid,pwd; rr\u)D#)
className = "oracle.jdbc.driver.OracleDriver"; a3w6&e`
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; L'`Au/%S}
uid = "system"; bc~WJ+
pwd = "manager";
"$J5cco
Class.forName(className); vL[IVBG^
Connection cn = DriverManager.getConnection(url,uid,pwd); a'Odw2Q_
2)用jndi(java的命名和目录服务)方式 lfCr`[!E
例子 >b9J!'G,(
String jndi = "jdbc/db"; 5[B)U">]
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); D4y!l~_,%M
DataSource ds = (DataSource) ctx.lookup(jndi); +HWFoK
Connection cn = ds.getConnection(); FNOsw\Bo
多用于jsp中 5bXpj86mY
2、执行sql语句 P2`F"
Qsq
1)用Statement来执行sql语句 (;05=DsO
String sql; WoB'B|%
Statement sm = cn.createStatement(); H<q|je}e
sm.executeQuery(sql); // 执行数据查询语句(select) I9aiAD0s
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); !t~tIJ>6
2)用PreparedStatement来执行sql语句 L
aA<`
String sql; ._A4:
sql = "insert into user (id,name) values (?,?)"; GhcH"D%-
PreparedStatement ps = cn.prepareStatement(sql); <o3I<ci6
ps.setInt(1,xxx); g{sp<w0
ps.setString(2,xxx); 2^Im~p~ByE
... 4Y3@^8h&=
ResultSet rs = ps.executeQuery(); // 查询 T95FoA
int c = ps.executeUpdate(); // 更新 VB4V[jraCF
U=j`RQ 9,
3、处理执行结果 n{~&^Nby*I
查询语句,返回记录集ResultSet K8-1?-W
更新语句,返回数字,表示该更新影响的记录数 d_&pxy?
>
ResultSet的方法 3_boEYl0
1、next(),将游标往后移动一行,如果成功返回true;否则返回false zd-
*UFi
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Lk$Mfm5"M
Evg#sPu\
4、释放连接 3*j1v:x`
cn.close(); 9eP*N(m<
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection c2:,
}QQl.'
可滚动、更新的记录集 3$K[(>s
1、创建可滚动、更新的Statement ?G~rYETvw
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); sm G?y~
该Statement取得的ResultSet就是可滚动的 tBZ?UAe;
2、创建PreparedStatement时指定参数 dQ_'8
)
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); K%/\XnCY
ResultSet.absolute(9000); <jYyA]Zy5
批量更新 -"2 t^Q
1、Statement g[@0H=
Statement sm = cn.createStatement(); x30|0EHYl[
sm.addBatch(sql1); XH*(zTd(?
sm.addBatch(sql2); yV L >Ie/
... 3xP<J)S0
sm.executeBatch() H=WB6~8)
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 8::y5Yv]
2、PreparedStatement YKayaI\*
PreparedStatement ps = cn.preparedStatement(sql); &6Lh>n(
{ !nsr( 7X2
ps.setXXX(1,xxx); %t1Z!xv_
... ('BB9#\t
ps.addBatch(); #wvGS%
} ds+2z=!!e
ps.executeBatch(); |d6/gSiF
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 *M:p[.=1
Y Kp@n8A
事务的处理 Pd d(1K*
1、关闭Connection的自动提交 Pjvb}q=
cn.setAutoCommit(false); N~`r;E
2、执行一系列sql语句 l9+CJAmq
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close _Fv6S}~Q
Statement sm ; aWLA6A+C&
sm = cn.createStatement(insert into user...); J &=5h.G$
sm.executeUpdate(); g2LvojR
sm.close(); +@8, uL
sm = cn.createStatement("insert into corp...); ^Df qc-]
sm.executeUpdate(); ErsJWp
sm.close(); 5OOXCtIKf
3、提交 Tb:'M:dM"
cn.commit(); :AuK Q`c
4、如果发生异常,那么回滚 4-'0# a
cn.rollback();