java 数据库基本操作 S[g{
)p)
1、java数据库操作基本流程 '*K}$+l
2、几个常用的重要技巧: K]5@bm
可滚动、更新的记录集 ;la sk4|
批量更新 .dqV fa
事务处理 yr=$a3web;
K)!yOa'fH
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 A|3'9iL{9
1、取得数据库连接 !>gi9z,
1)用DriverManager取数据库连接 J${'?!N
例子 };{V]f 0
String className,url,uid,pwd; WBcnE(zF
className = "oracle.jdbc.driver.OracleDriver"; h+ixl#:
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; x93t.5E6
uid = "system"; 6@ B_3y
pwd = "manager"; 7{0;<@
Class.forName(className); ?4 p\ujc
Connection cn = DriverManager.getConnection(url,uid,pwd); X6hm,0[
2)用jndi(java的命名和目录服务)方式 ;Ih:$"$!
例子 PtP{_9%Dz
String jndi = "jdbc/db"; 2Fwp\I;
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); NF9fPAF%;
DataSource ds = (DataSource) ctx.lookup(jndi); [=f(u
wY>g
Connection cn = ds.getConnection(); O"%b@$p\L
多用于jsp中 3QNu7oo
2、执行sql语句 |"t)#BUtL
1)用Statement来执行sql语句 V $'~2v{_
String sql; hsYS<]
Statement sm = cn.createStatement(); U tb"6_
sm.executeQuery(sql); // 执行数据查询语句(select) L;jzDng<
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); :x85:pa
2)用PreparedStatement来执行sql语句 6k569c{7
String sql; v D"4aw
sql = "insert into user (id,name) values (?,?)"; RRXnj#<g
PreparedStatement ps = cn.prepareStatement(sql); Q)`3&b
ps.setInt(1,xxx); QYl
Pr&O9
ps.setString(2,xxx); 2VB|a;Mo
... [diUO1p
ResultSet rs = ps.executeQuery(); // 查询 dY|~"6d)
int c = ps.executeUpdate(); // 更新 _[J @w .l(
\OR=+\].9
3、处理执行结果 .K
I6<k/
查询语句,返回记录集ResultSet e,*E`ol
更新语句,返回数字,表示该更新影响的记录数 _c[Bjip
ResultSet的方法 !'yCB9]O
1、next(),将游标往后移动一行,如果成功返回true;否则返回false VTM*=5|c
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 3W&f^*
#Tm^$\*h\]
4、释放连接 }q8|t3
cn.close(); v@_^h}h/,=
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection AcRrk
G3Z>,"w;=
可滚动、更新的记录集 ?%)G%2
1、创建可滚动、更新的Statement ;^fGQ]`4
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); j.}@ 9
该Statement取得的ResultSet就是可滚动的 _SVIY@K|/
2、创建PreparedStatement时指定参数 O$
p
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 'aj97b;lpG
ResultSet.absolute(9000); cOhx
批量更新 ,drbj.0-
1、Statement g4p-$WyT8>
Statement sm = cn.createStatement(); c4\Nuy
sm.addBatch(sql1); abs\Ku9
sm.addBatch(sql2); H@-txO1`::
... JI"&3H")g%
sm.executeBatch() c%?31t
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 hU:
9zLe
2、PreparedStatement E;I'b:U`
PreparedStatement ps = cn.preparedStatement(sql); yaDK_fk
{ U;PGBoe
ps.setXXX(1,xxx); )\xDo<@
... >0^oC[ B
ps.addBatch(); \:7G1_o
} n:TWZ.9
ps.executeBatch(); r2t|,%%N7
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 )Id.yv}_
QYS 1.k
事务的处理 zc1y)s0G
1、关闭Connection的自动提交 Y.7iKMp(
cn.setAutoCommit(false); CO%o.j=1
2、执行一系列sql语句 utH/E7^8
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close /=y _#l
Statement sm ; (vO\h8
sm = cn.createStatement(insert into user...); +1uAzm4SL
sm.executeUpdate(); \E}YtN#
sm.close(); }3%L3v&
sm = cn.createStatement("insert into corp...); ^0x0 rY
sm.executeUpdate(); %$'YP
sm.close(); {Yt@H
3、提交 \w6A-daD0
cn.commit(); &1ZqC;
4、如果发生异常,那么回滚 /V>q(Q
cn.rollback();