java 数据库基本操作 r,x;q
1、java数据库操作基本流程 t$Z#zxX
2、几个常用的重要技巧: of^N4
可滚动、更新的记录集 ;
. c]0
批量更新 Hdh'!|w
事务处理 P$\vD^
GIDC'
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 <Ep-aRI
1、取得数据库连接 b&!7(Q[ sT
1)用DriverManager取数据库连接 Au,}5=+`P
例子 '@iS5Fni
String className,url,uid,pwd; ~J6c1jG
className = "oracle.jdbc.driver.OracleDriver"; dt
4_x1
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; J~:/,'Ea
uid = "system"; 16YJQ ue
pwd = "manager"; Ov)rsi
Class.forName(className); A|YqBl
Connection cn = DriverManager.getConnection(url,uid,pwd); vF;%#P
2)用jndi(java的命名和目录服务)方式 ;ePmN|rq;
例子 *"Ipu"G5?
String jndi = "jdbc/db"; dQt*/]{q
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); LRv-q{jP;
DataSource ds = (DataSource) ctx.lookup(jndi); XH0R:+s
Connection cn = ds.getConnection(); !G#3jh:kiY
多用于jsp中 J+LFzl07q
2、执行sql语句 ]v 6u
1)用Statement来执行sql语句 cv0}_<Tyx
String sql; g/4.^c
Statement sm = cn.createStatement(); K{HRjNda#
sm.executeQuery(sql); // 执行数据查询语句(select) d7u"Z5t
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); h?DMrYk_%#
2)用PreparedStatement来执行sql语句 +aV>$Y
String sql; ^m{kn8
sql = "insert into user (id,name) values (?,?)"; !+T+BFw.
PreparedStatement ps = cn.prepareStatement(sql); |_%|
ps.setInt(1,xxx); xUzSS@ot^
ps.setString(2,xxx); [Qv%
... c`y[V6q9
ResultSet rs = ps.executeQuery(); // 查询 2ZB'WzH.X
int c = ps.executeUpdate(); // 更新 -[x^z5Ee`
_'dsEF
3、处理执行结果 ){")RrD(
查询语句,返回记录集ResultSet y8wOJZ<K
更新语句,返回数字,表示该更新影响的记录数 ^Yn{Vi2.
ResultSet的方法 e4ajT
1、next(),将游标往后移动一行,如果成功返回true;否则返回false
h.g11xa
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 9QI\[lT&
?jBna
~
4、释放连接
~-6Kl3Y
cn.close(); A[!Fg0X0
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection
7+j@0v\
t@!X1?`w
可滚动、更新的记录集 ,l`q
1、创建可滚动、更新的Statement Sz"J-3b^
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); gNzQ"W=
该Statement取得的ResultSet就是可滚动的 e0*',
2、创建PreparedStatement时指定参数 ZV_Z)<
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); h&5H`CR[
ResultSet.absolute(9000); JMOQDo
批量更新 g{f1JTJ7
1、Statement \A5cM\-
Statement sm = cn.createStatement(); VD+8j29
sm.addBatch(sql1); 6,0pkx&Nv
sm.addBatch(sql2); ."PR Z,
... ;vF8V`f
sm.executeBatch() "a6
wd
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 lbgnO s,
2、PreparedStatement >3X!c"#l
PreparedStatement ps = cn.preparedStatement(sql); %dS7u$Rnh
{ (ZjIwA9>
ps.setXXX(1,xxx); ?Gj$$IAe
... &H,j
.~a&l
ps.addBatch(); 7vcYI#(2
Y
} FymA_Eq
ps.executeBatch(); OgS6#X
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 qw0tw2|
z(>{"t<C
事务的处理 #v')iR"
1、关闭Connection的自动提交 {`KgyCW:
cn.setAutoCommit(false); pR&cdORsP
2、执行一系列sql语句 3.Qf^p
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ~7b'4\
Statement sm ; }`Q'!_`
sm = cn.createStatement(insert into user...); -Z<e`iFQS
sm.executeUpdate(); n@5pS3qZ
sm.close(); brNe13d3~"
sm = cn.createStatement("insert into corp...); V@84Cb
sm.executeUpdate(); usR19 _E-
sm.close(); z>&Py(
3、提交 av gGz8
cn.commit(); V_~}7~
I
4、如果发生异常,那么回滚 '9*wr*
cn.rollback();