java 数据库基本操作 1bz^$2/k
1、java数据库操作基本流程 O,+9r_Gh
2、几个常用的重要技巧: o3GZcH?
可滚动、更新的记录集 <tO@dI$~>
批量更新 1DU
l<&4
事务处理 GM8>u O
>'m&/&h
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 9 M?UPE
1、取得数据库连接 'b [O-6v
1)用DriverManager取数据库连接 q$H@W.f
例子 2ZbSdaM=
String className,url,uid,pwd; :%28*fl
className = "oracle.jdbc.driver.OracleDriver"; sAjUX.c
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; lpB:lRM
uid = "system"; 9!r0uU"
pwd = "manager"; f;+.j/ +
Class.forName(className); ]4')H;'y
Connection cn = DriverManager.getConnection(url,uid,pwd); @az<D7j2
2)用jndi(java的命名和目录服务)方式 $6ucz'
例子 oFt_ yU-
String jndi = "jdbc/db"; h1B_*L
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 8Bc2?NI=
DataSource ds = (DataSource) ctx.lookup(jndi); xHx_!
)7
Connection cn = ds.getConnection(); @yQ1F>
t
多用于jsp中 xU{0rM"
2、执行sql语句 AU}|o0Ur
1)用Statement来执行sql语句 2A*,9S|Y
String sql; 4QPHT#e qX
Statement sm = cn.createStatement(); -W/D Cj<
sm.executeQuery(sql); // 执行数据查询语句(select) 3*{l^<`:gA
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); #;1RStb:zj
2)用PreparedStatement来执行sql语句 <JXHg,Q
String sql; &{# 6Z
sql = "insert into user (id,name) values (?,?)"; _BgWy#
PreparedStatement ps = cn.prepareStatement(sql); b9wC:NgQx
ps.setInt(1,xxx); ]f`UflMO8
ps.setString(2,xxx); GVf[H2%H
... s/3sOb}sA
ResultSet rs = ps.executeQuery(); // 查询 "N EKz
int c = ps.executeUpdate(); // 更新 qauvwAMuX
lA6{TH.x
3、处理执行结果 'UGgY3
查询语句,返回记录集ResultSet P uQ
更新语句,返回数字,表示该更新影响的记录数 U5F1m]gFr
ResultSet的方法 9N2.:<so
1、next(),将游标往后移动一行,如果成功返回true;否则返回false N!tNRMTi
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Aj O{c=d
#K` [XA
4、释放连接 JvCy&xrE;
cn.close(); 8MU7|9 Q
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection BHkicb ?
@C('kUX~!
可滚动、更新的记录集 5ff5M=M
1、创建可滚动、更新的Statement 1} _<q k9
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 1?"Zrd
该Statement取得的ResultSet就是可滚动的 1xsJz^%V
2、创建PreparedStatement时指定参数 ;<cCT!A
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); "}[ ]R
ResultSet.absolute(9000); a>y e
批量更新 |1<B(iB'{/
1、Statement g<w1d{Td
Statement sm = cn.createStatement(); MP
)nQ
sm.addBatch(sql1); Y_XRf8Sw
sm.addBatch(sql2); jrm^n_6};
... 3EA_-?
sm.executeBatch() OzxiT +
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Un+- T
2、PreparedStatement od !s5f!
PreparedStatement ps = cn.preparedStatement(sql); QY\'Uu{
{ `$JOFLa
ps.setXXX(1,xxx); D-m%eP.
... or)fx/ %h
ps.addBatch(); |\ C.il7
} ,W]}mqV%.'
ps.executeBatch(); :4\_upRE
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 h7xgLe@
h-m0Ro?6
事务的处理 ,oEAWNbgQ
1、关闭Connection的自动提交 b$*G&d5
cn.setAutoCommit(false); Jcp=<z*0
2、执行一系列sql语句 2 0A:,pMb
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close p-z!i +
Statement sm ; @}%kSn5y:
sm = cn.createStatement(insert into user...); Vrp]YRL`
sm.executeUpdate(); D [v22 5
sm.close(); mndEB!b
sm = cn.createStatement("insert into corp...); x;4m@)Mu
sm.executeUpdate(); g ZES}]N
sm.close(); xKT;1(Mk
3、提交 :X 1Y
cn.commit(); N>@.(f&w
4、如果发生异常,那么回滚
vMJC
cn.rollback();