java 数据库基本操作 jTR?!Mt0
1、java数据库操作基本流程 5Rl\& G\
2、几个常用的重要技巧: {]+t<
可滚动、更新的记录集 Sy VGm@
批量更新 Wu{=QjgY
事务处理 o*H U^
>>J3"XHX
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 5(H%Ia
1、取得数据库连接 j"nOxs
1)用DriverManager取数据库连接 W+&5G(z~
例子 d AcSG
String className,url,uid,pwd; _H]^7`;
className = "oracle.jdbc.driver.OracleDriver"; ]"_c-=
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; P)K$+oo
uid = "system"; ]QaKXg)3q
pwd = "manager"; `sKyvPtG
Class.forName(className); LJ[zF~4#
Connection cn = DriverManager.getConnection(url,uid,pwd); B)Y[~4o
2)用jndi(java的命名和目录服务)方式 :rL%,o"
例子 l?*DGW(t{
String jndi = "jdbc/db"; %(6IaqJ[
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); \o!3TK"N
DataSource ds = (DataSource) ctx.lookup(jndi); #`u}#(
Connection cn = ds.getConnection(); 96^aI1:
多用于jsp中 lndz
2、执行sql语句 N_T5sZ\
1)用Statement来执行sql语句 &q>8D'
String sql; e\C-a4[C8P
Statement sm = cn.createStatement(); $/M-@3wro
sm.executeQuery(sql); // 执行数据查询语句(select) Z
i6s0Uck
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); hty'L61\z
2)用PreparedStatement来执行sql语句 fLe~X!#HF
String sql; |H
t5a.
sql = "insert into user (id,name) values (?,?)"; n>}Y@{<]/
PreparedStatement ps = cn.prepareStatement(sql); *Y(59J2
ps.setInt(1,xxx); Y ]([K.I=
ps.setString(2,xxx); +fk*c[FG
... 7z$Z=cs
ResultSet rs = ps.executeQuery(); // 查询 2{h2]F
int c = ps.executeUpdate(); // 更新 Hi09?AX
QH-CZ6M
3、处理执行结果 fi
HE`]0
查询语句,返回记录集ResultSet 2?~nA2+vm
更新语句,返回数字,表示该更新影响的记录数 $YX{gk>
ResultSet的方法 :C_/K(Rkl
1、next(),将游标往后移动一行,如果成功返回true;否则返回false (C.
$w
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 i%9vZ
m ~&
4、释放连接 \( s `=(t
cn.close(); FFqK tj's
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection kD#n/RBgf
\< .BN;t{
可滚动、更新的记录集 y[XD=j
1、创建可滚动、更新的Statement st)is4
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ^i8,9T'=
该Statement取得的ResultSet就是可滚动的 q8$t4_pF
2、创建PreparedStatement时指定参数 Leb
Kzqe
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 1)=
H2n4)
ResultSet.absolute(9000); y8$3kXh
批量更新 iW6O9~
1、Statement ?1ey$SSU]
Statement sm = cn.createStatement(); `NQ
sm.addBatch(sql1); r^
Dm|^f#
sm.addBatch(sql2); CC=I|/mBM
... ` &A`&-nc=
sm.executeBatch() ,w~3K%B4
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 1x_EAHZ>7
2、PreparedStatement Tm`@5
PreparedStatement ps = cn.preparedStatement(sql); rT `sY
{ h-PJC/>
ps.setXXX(1,xxx); vt5w(}v(
... ~Fb@E0 }!
ps.addBatch(); |X=p`iz1&
} rpiuFst
ps.executeBatch(); c
\??kQH
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 yc*cT%?g
9CS"s_
事务的处理 TIJH}Ri
1、关闭Connection的自动提交 $}(Z]z}O ;
cn.setAutoCommit(false);
:Hq%y/
2、执行一系列sql语句 qA '^b~
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close V<9L-7X 8
Statement sm ; p-"C^=l
sm = cn.createStatement(insert into user...); Qp<*or@
sm.executeUpdate(); "9xJ},:-
sm.close(); ?>+uO0*S
sm = cn.createStatement("insert into corp...); ]izHn; +
sm.executeUpdate(); )r.Wge
sm.close(); m^oG9&";
3、提交 Ze%S<xT!O
cn.commit(); K ar!
4、如果发生异常,那么回滚 p1'q{E+o*
cn.rollback();