java 数据库基本操作 #1-xw~_
1、java数据库操作基本流程 BZK`O/
2、几个常用的重要技巧: 4pz|1Hw7
可滚动、更新的记录集 }A$WO{2
批量更新 s Wjy6;
事务处理 + bhym+
vdoZ&Tu
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 @MR?6 n*k
1、取得数据库连接 CR<`ZNuWz
1)用DriverManager取数据库连接 v{x{=M]
例子 -]G(ms;}/Y
String className,url,uid,pwd; HHk)ZfWRo
className = "oracle.jdbc.driver.OracleDriver";
Y]aW)u
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; )o _j]K+xI
uid = "system"; {[Q0qi =
pwd = "manager"; YMpf+kN
Class.forName(className); w*j$uW6{
Connection cn = DriverManager.getConnection(url,uid,pwd); '8FC<=+p[
2)用jndi(java的命名和目录服务)方式 woH)0v
例子 =/Aj
String jndi = "jdbc/db"; 72oWhX=M%
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 1m<RwI3s
DataSource ds = (DataSource) ctx.lookup(jndi); qUF'{K
Connection cn = ds.getConnection(); 4R+.N
多用于jsp中 ]Z<_ "F
2、执行sql语句 c/W=$3
1)用Statement来执行sql语句 f5RE9%.#~
String sql; u?+bW-D'd
Statement sm = cn.createStatement(); Fr?z"
sm.executeQuery(sql); // 执行数据查询语句(select) c2SC|s]
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); DmqX"x%P
2)用PreparedStatement来执行sql语句 G1T^a>tj4
String sql; Q'apG)0I
sql = "insert into user (id,name) values (?,?)"; 8
}'|]JK
PreparedStatement ps = cn.prepareStatement(sql); 3.
WF}8
ps.setInt(1,xxx); =H7xD"'%R
ps.setString(2,xxx); i?;r7>
... g8;D/
ResultSet rs = ps.executeQuery(); // 查询 wz8PtfZ
int c = ps.executeUpdate(); // 更新 DsD zkwJE
y k161\
3、处理执行结果 0CvsvUN@
查询语句,返回记录集ResultSet t/i5,le
更新语句,返回数字,表示该更新影响的记录数 C2e.2)y
ResultSet的方法 %n0;[sD0A
1、next(),将游标往后移动一行,如果成功返回true;否则返回false UnWW/]E
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 T0HuqJty
[jx0-3s:X
4、释放连接 }b3/b
cn.close(); Hq &"+1F
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection D6D1S/:ij'
Z~G my7h(
可滚动、更新的记录集 9W*+SlH@!
1、创建可滚动、更新的Statement >gtQw!
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); >v;8~pgO
该Statement取得的ResultSet就是可滚动的 =x#FbvV
2、创建PreparedStatement时指定参数 OqhD7 +
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 6V9doP ]i
ResultSet.absolute(9000); z(RL<N%
批量更新 ~K_Uq*dCE
1、Statement 7;`o(
[N
Statement sm = cn.createStatement(); hi=XYC,
sm.addBatch(sql1); ;_kzcK!l
sm.addBatch(sql2); fCAiLkT,C[
... yWPIIWHx!
sm.executeBatch() EER`?Sa(
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 6bc337b
2、PreparedStatement ^:, l\Y
PreparedStatement ps = cn.preparedStatement(sql); k4J8O3E
{ 5R$G(Ap_
ps.setXXX(1,xxx); [ Mg8/Oy
... Ha>*?`?yI
ps.addBatch(); gv15t'y9
} iSRpfU
ps.executeBatch(); &tR(n$M@>
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 jPvDFT^d/
td2/9|Q
事务的处理 w-B^
[<
1、关闭Connection的自动提交 R
cn.setAutoCommit(false); Q }k.JS~#
2、执行一系列sql语句
8Chj
w wB
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close |C \}P
Statement sm ; *TW=/+j
sm = cn.createStatement(insert into user...); KP;(Q+qTx
sm.executeUpdate(); Huw\&E
sm.close(); d87vl13
sm = cn.createStatement("insert into corp...); V5}nOGV9
sm.executeUpdate(); V2Q$g^X'
sm.close(); SD\=
m/W
3、提交 [t\B6XxT
cn.commit(); }n,Zl>T9
4、如果发生异常,那么回滚 :!&;p
cn.rollback();