java 数据库基本操作 !y862oKD
1、java数据库操作基本流程 uvRX{q4
2、几个常用的重要技巧: 50dx[v8
可滚动、更新的记录集 BQ=JZ4&
批量更新 "[sr0'g:
事务处理 B@ >t$jK
fRwr}n'
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 _=9m[
1、取得数据库连接 4,&f#=Y
1)用DriverManager取数据库连接 y~z&8XrH
例子 _U
o3_us
String className,url,uid,pwd; [M#(su0fv
className = "oracle.jdbc.driver.OracleDriver"; ,uD}1
G<u
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; hGI5^!Cq
uid = "system"; 4WPco"xH!
pwd = "manager"; ]l"9B'XR
Class.forName(className); ex.^V sf_
Connection cn = DriverManager.getConnection(url,uid,pwd); RSx{Gbd4X
2)用jndi(java的命名和目录服务)方式 5^{ I}Q
例子 mln%Rd6u/
String jndi = "jdbc/db"; \0)2 u[7
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); sRQ4pnnrn
DataSource ds = (DataSource) ctx.lookup(jndi); Knp}88DR^j
Connection cn = ds.getConnection(); HP=5a.
多用于jsp中 a_zf*;
2、执行sql语句 W]D+[mpgK
1)用Statement来执行sql语句 CQA^"Ll
String sql; id)J;!^;J
Statement sm = cn.createStatement(); ?[.g~DK,
sm.executeQuery(sql); // 执行数据查询语句(select) WHr:M/qD
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); !,~C
2)用PreparedStatement来执行sql语句 N.vkM`Z
String sql; @2eH;?uO
sql = "insert into user (id,name) values (?,?)"; FX+^S?x.
PreparedStatement ps = cn.prepareStatement(sql); a
fB?js6
ps.setInt(1,xxx); C9j5Pd5q1L
ps.setString(2,xxx); '<h@h*R
... 'EB5#
ResultSet rs = ps.executeQuery(); // 查询 3=_to7]
int c = ps.executeUpdate(); // 更新 sh%%U
"R[6Q ^vw
3、处理执行结果 -];Hb'M.!e
查询语句,返回记录集ResultSet ^ lG^.
更新语句,返回数字,表示该更新影响的记录数 ze`qf%
ResultSet的方法 0Hr)h{!F"
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Oe0dC9H
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 (Li)@Cn%
OQ _wsAA
4、释放连接 3ZqtIQY`
cn.close(); nz`"f,
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection D[(T--LLT
nN(Q}bF
可滚动、更新的记录集 (N{
1、创建可滚动、更新的Statement ,-.=]r/s
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); [[Usrbf
该Statement取得的ResultSet就是可滚动的 {#l@9r%
2、创建PreparedStatement时指定参数 ?Q6ZZQ~
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); CM+wkU ?,
ResultSet.absolute(9000); >H?~2O
批量更新 #Y>d@
1、Statement 9z(h8H
Statement sm = cn.createStatement(); @_?8I_\:
sm.addBatch(sql1); cKAZWON8;v
sm.addBatch(sql2); j*jq2u
... #~ [mn_C
sm.executeBatch() gR{.0e
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有
(<#Ns W!z
2、PreparedStatement nmrdqSV
PreparedStatement ps = cn.preparedStatement(sql); C5oIl_t
{ |y2cI,&
ps.setXXX(1,xxx); y{\(|j
... @_Ly^'
"
ps.addBatch(); z(beT e
} Vt
U
ps.executeBatch(); ^i~'aq
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 #|{^k u
2n5{H fpY
事务的处理 Q"H1(kG|
1、关闭Connection的自动提交 HltURTbI
cn.setAutoCommit(false); _Y,d|!B#L
2、执行一系列sql语句 "a>a
"Ei
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close E- rXYNfy
Statement sm ; f5QJj<@
sm = cn.createStatement(insert into user...); {~:F1J~=
sm.executeUpdate(); mH09*
Z
sm.close(); $kk!NAW
sm = cn.createStatement("insert into corp...); t2vo;,^euL
sm.executeUpdate(); ?\Z-3l%M
sm.close(); S#,
E)h/
3、提交 f<G:}I
cn.commit(); )haHI)xR
4、如果发生异常,那么回滚 ~0@+8%^>;
cn.rollback();