java 数据库基本操作 >j/w@Fj
1、java数据库操作基本流程 vt8By@]:
2、几个常用的重要技巧: ]`K2N
可滚动、更新的记录集 vgPCQO([
批量更新 WMdg1J+~
事务处理 JI}'dU>*U:
3$ pX
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 l-Z4Mq6*L
1、取得数据库连接 j_AACq
{.
1)用DriverManager取数据库连接
)2.Si#
例子 e=
AKD#
String className,url,uid,pwd; wj,=$RX
className = "oracle.jdbc.driver.OracleDriver"; +whDU2 "
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; q1,~
uid = "system"; py4 h(04u
pwd = "manager"; Xhm
c6?
Class.forName(className); DUS6SO
Connection cn = DriverManager.getConnection(url,uid,pwd); SU0
hma8
2)用jndi(java的命名和目录服务)方式 ! mHO$bQ"
例子 CrLrw T
String jndi = "jdbc/db"; 3S{/>1Y
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ";F'~}bDA
DataSource ds = (DataSource) ctx.lookup(jndi); i@yC-))bY
Connection cn = ds.getConnection(); s_Sk0}e
多用于jsp中 ;TYBx24vD'
2、执行sql语句 Dtk=[;"k2a
1)用Statement来执行sql语句 p+eh%2Jm
String sql; se)TzI^]b@
Statement sm = cn.createStatement();
ep8
sm.executeQuery(sql); // 执行数据查询语句(select) 1#x0 q:6
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); F%|h;+5
2)用PreparedStatement来执行sql语句 D~m*!w*
String sql; qm}@!z^
sql = "insert into user (id,name) values (?,?)"; d0D]Q
PreparedStatement ps = cn.prepareStatement(sql); p{_" bB
ps.setInt(1,xxx); @C$]//;
ps.setString(2,xxx); s<Ziegmw|g
... +>,I1{u%&
ResultSet rs = ps.executeQuery(); // 查询 m`XHKRp
int c = ps.executeUpdate(); // 更新 7dWS
qPNR`%}Q
3、处理执行结果 R_C)
查询语句,返回记录集ResultSet 4 KiY6)
更新语句,返回数字,表示该更新影响的记录数 TOt dUO
ResultSet的方法
D7Z /H'|
1、next(),将游标往后移动一行,如果成功返回true;否则返回false .Mbz3;i0
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 tw;}jh
S[gx{Bxiw
4、释放连接 <I?Zk80
cn.close(); W1~0_;
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 4x34u}l
]^E?;1$f?
可滚动、更新的记录集 lxx2H1([
1、创建可滚动、更新的Statement C+$#y2"z#n
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Ui~>SN>s
该Statement取得的ResultSet就是可滚动的 ?s01@f#
2、创建PreparedStatement时指定参数 ';CNGv -
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); @gblW*Zhk
ResultSet.absolute(9000); 01]f2.5
批量更新 >:-$+I
1、Statement Sjqpec8
Statement sm = cn.createStatement(); y[;>#j$
sm.addBatch(sql1); >MZ/|`[M
sm.addBatch(sql2); ytImB`'\
... ?,z}%p
sm.executeBatch() Dt@SqX:~Ee
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 #a#F,ZT
2、PreparedStatement O-wzz
PreparedStatement ps = cn.preparedStatement(sql); )=+|i3]U
{ 5pX6t
ps.setXXX(1,xxx); 6nn*]|7
... /~1+i'7V.,
ps.addBatch(); Rcuz(yS8
} rq{$,/6.
ps.executeBatch(); }BEB1Q}L
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 w;M#c
Y
81F9uM0
事务的处理 vM={V$D&
1、关闭Connection的自动提交 pa+hL,w{6
cn.setAutoCommit(false); :OT&
2、执行一系列sql语句 M\j.8jG
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close _ q"Gix
Statement sm ; 0GwR~Z}Z
sm = cn.createStatement(insert into user...); 6tZI["\
sm.executeUpdate(); zLQx%Yg!
sm.close(); }MySaL>
sm = cn.createStatement("insert into corp...); >*bvw~y,
sm.executeUpdate(); ".%k6W<n
sm.close(); g)-te+?6
3、提交 X$
D6Ey
cn.commit(); kh<2BOV
4、如果发生异常,那么回滚 ctQ/wrkU
cn.rollback();