java 数据库基本操作 _p%n%Oce
1、java数据库操作基本流程 hL6;n*S=
2、几个常用的重要技巧: z)U7
可滚动、更新的记录集 ;h+~xxu=X
批量更新 [RN]?,
事务处理 5|*`} ;/y
N'9T*&o+
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 z8awND
1、取得数据库连接 <\ <o#Vq
1)用DriverManager取数据库连接 M @-:iP
例子 u "jV#,,
String className,url,uid,pwd; {9}CU~R
className = "oracle.jdbc.driver.OracleDriver"; '!`\!=j-`
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; n`&D_AbQ
uid = "system"; M1xsGa9h&
pwd = "manager"; `MuX/[q
Class.forName(className); 65qqs|&w;[
Connection cn = DriverManager.getConnection(url,uid,pwd); _Iav2=0Wi
2)用jndi(java的命名和目录服务)方式 } v:YSG
例子 Z s=A<[
String jndi = "jdbc/db"; NT.#U?9c
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); &xN+a{&
DataSource ds = (DataSource) ctx.lookup(jndi); QJ4$) Fr(
Connection cn = ds.getConnection(); `3i>e<m~
多用于jsp中 <MkvlLu((o
2、执行sql语句 ~Ay)kv;
1)用Statement来执行sql语句 HrvyI)4{
String sql; WIf.;B)L
Statement sm = cn.createStatement(); 2{63:f1c`'
sm.executeQuery(sql); // 执行数据查询语句(select) 0jlM~ H
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); J|f29B-c
2)用PreparedStatement来执行sql语句 4k@n5JNa
String sql; > B@ c74
sql = "insert into user (id,name) values (?,?)"; >bze0`}Z
PreparedStatement ps = cn.prepareStatement(sql); 0t^FM<7G
ps.setInt(1,xxx); dGBjV #bNT
ps.setString(2,xxx); e~zgH\`
... M=uT8JB
ResultSet rs = ps.executeQuery(); // 查询 gtu<#h(
int c = ps.executeUpdate(); // 更新 pN5kcvQ
HS{Vohy >
3、处理执行结果 N=<`|I
查询语句,返回记录集ResultSet )^{}ov
更新语句,返回数字,表示该更新影响的记录数 G]f|?
ResultSet的方法 8CZfz!2
1、next(),将游标往后移动一行,如果成功返回true;否则返回false v
f{{z%3T
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ?PMbbqa0
S
\]O8#OX
4、释放连接 d7vPZ_j^z
cn.close(); I@ueeDY
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 'Y)aGH(
&=kv69v
可滚动、更新的记录集 P\ke%Jdpw?
1、创建可滚动、更新的Statement /ki-Tha
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); pvyEs|f=%
该Statement取得的ResultSet就是可滚动的 oc( '!c
2、创建PreparedStatement时指定参数 HbA/~7
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); u7hu8U=
ResultSet.absolute(9000); M@.S Q@E
批量更新 $YEm(:v$
1、Statement -9t"$)&
Statement sm = cn.createStatement(); mYgfGPF`
sm.addBatch(sql1); :IS?si5|
sm.addBatch(sql2); p lnH
... -t|/g5.w_
sm.executeBatch() 0d_)C>gcF
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 l5Bm.H_
2、PreparedStatement hbx4[Pf
PreparedStatement ps = cn.preparedStatement(sql); Cj8&wz}ez
{ `w:kY9
ps.setXXX(1,xxx); p!YK~cH[
... zx}+Q B0
ps.addBatch(); !2Nk
} SKH}!Id}n
ps.executeBatch(); )DXt_leLg
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 <C'_:&M
/"g Ryv
事务的处理 80@\e
1、关闭Connection的自动提交 B~KxUp
cn.setAutoCommit(false); ?/3wO/7[
2、执行一系列sql语句 W|>jj$/o
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close QLO;D)fC
Statement sm ; B&a{,.m&q6
sm = cn.createStatement(insert into user...); ,w#lUgp
sm.executeUpdate(); R}0gIp=
sm.close();
`;6M|5G
sm = cn.createStatement("insert into corp...); ?CQE6ch
sm.executeUpdate(); H<_Tn$<zH.
sm.close(); 3s!6rT_=)d
3、提交 ^~[7])}g6
cn.commit(); bu _ @>`S
4、如果发生异常,那么回滚 E#,"C`&*
cn.rollback();