java 数据库基本操作 jW`JThoq
1、java数据库操作基本流程 !Yb !Au[
2、几个常用的重要技巧: {owuYVm
可滚动、更新的记录集 K-C,n~-
批量更新 WV$CZgL
事务处理 |}
b+$J
\6&Ml]1
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 d6QrB"J`
1、取得数据库连接 9m$;C'}Z
1)用DriverManager取数据库连接 <Pt?N2]A|
例子 Z)W8Of_
String className,url,uid,pwd; Blzvn19'h
className = "oracle.jdbc.driver.OracleDriver"; I61S0lz/
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; :LNE?@
uid = "system"; h:362&?]
pwd = "manager"; !="q"X/*
Class.forName(className); v5S9h[gT
Connection cn = DriverManager.getConnection(url,uid,pwd); YkWHI(p
2)用jndi(java的命名和目录服务)方式 2uE<mjCt-r
例子 f(m,!
String jndi = "jdbc/db"; k(dakFaC^
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 6Kpq~o
DataSource ds = (DataSource) ctx.lookup(jndi); v{a%TA9-
Connection cn = ds.getConnection(); Q!1 ;xw~
多用于jsp中 Z{0BH{23
2、执行sql语句 f+ceL'fr
1)用Statement来执行sql语句 mg'q-G`\<
String sql; c("|xe
Statement sm = cn.createStatement(); oM~y8O
sm.executeQuery(sql); // 执行数据查询语句(select) \s5Uvws
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); |g 3:+&
2)用PreparedStatement来执行sql语句 E:pk'G0bZ
String sql;
:9UgERjra
sql = "insert into user (id,name) values (?,?)"; #%p44%W
PreparedStatement ps = cn.prepareStatement(sql); V[nPTYO4
ps.setInt(1,xxx); g;63$_<
ps.setString(2,xxx); T(7`$<TQ
... 29RP$$gR
ResultSet rs = ps.executeQuery(); // 查询 xGwImF$r
int c = ps.executeUpdate(); // 更新 ;3cbXc@]
eTS}-
3、处理执行结果 $5&%X'jk
查询语句,返回记录集ResultSet ^r\rpSN
更新语句,返回数字,表示该更新影响的记录数 uPz+*4+
ResultSet的方法 Q[j| 2U
1、next(),将游标往后移动一行,如果成功返回true;否则返回false !RmVb}m
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 }%jF!d
R#d~a;j
4、释放连接 V|MGG
cn.close(); ={:a
N)
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection .Ix3wR9
~ 1h#
可滚动、更新的记录集 :*''ci
1、创建可滚动、更新的Statement yXR1NYg
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); `Y?VQ~ci>
该Statement取得的ResultSet就是可滚动的 K.)!qkW-%S
2、创建PreparedStatement时指定参数 n(F!t,S1i
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); r.H`3m.0q
ResultSet.absolute(9000); P9cx&Hk9
批量更新 2^WJ1: A
1、Statement d+JK")$9C
Statement sm = cn.createStatement(); l'+3
6
sm.addBatch(sql1); 'cs(gc0
sm.addBatch(sql2); YO7U}6wBt
... EJkHPn
sm.executeBatch() QO'Hyf t
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 hC:'L9Y
2、PreparedStatement 4qOzjEQ
PreparedStatement ps = cn.preparedStatement(sql); !wy _3a
{ Y_'ERqQ
ps.setXXX(1,xxx); n N<N~
... t/iI!}
ps.addBatch(); I@'[> t
} 6 Xvpk1
ps.executeBatch(); JY0aE
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 >H;i#!9,
FQ<-Wc
事务的处理 \HeJc:^
1、关闭Connection的自动提交 h&<"jCjL
cn.setAutoCommit(false); $xbC^ k
2、执行一系列sql语句 +lym8n~-O
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close DK4yAR,g
Statement sm ; 1X?ro;
sm = cn.createStatement(insert into user...); T+0=Ou"N
sm.executeUpdate(); ob.<j
sm.close(); Bs~~C8+
sm = cn.createStatement("insert into corp...); n1f8jS+'}
sm.executeUpdate(); /Y7^!3uM
sm.close(); TrjyU
3、提交 =A"Abmx|
cn.commit(); \H] |5fp*
4、如果发生异常,那么回滚 bwsKdh
cn.rollback();