java 数据库基本操作 8xAxn+;
1、java数据库操作基本流程 &Nzq/~uqP
2、几个常用的重要技巧: U/9i'D[|{
可滚动、更新的记录集 j=&]=0F
批量更新 ]VuB2L[D
事务处理 %Y0,ww2
701mf1a
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Z>9uVBE02
1、取得数据库连接 G&eRhif
1)用DriverManager取数据库连接 '>8IOC
例子 U04TVQn`
String className,url,uid,pwd; lfle7;
className = "oracle.jdbc.driver.OracleDriver"; )qyJwN
.D
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; nU^ -D1s{
uid = "system"; mgODJ
pwd = "manager"; he/WqCZg
Class.forName(className); ^`BiA'gPPC
Connection cn = DriverManager.getConnection(url,uid,pwd); %MA o<,ha
2)用jndi(java的命名和目录服务)方式 DQ#rZi3I
例子 j@7%%
String jndi = "jdbc/db"; H K]-QTEn
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); #pe#(xoI
DataSource ds = (DataSource) ctx.lookup(jndi); TnuNoMD.
Connection cn = ds.getConnection(); //x^[fkNq)
多用于jsp中 [9hslk
2、执行sql语句 ]RBT9@-:U
1)用Statement来执行sql语句 {c(@u6l28
String sql; >g {w,
Statement sm = cn.createStatement(); /b|V=j}W
sm.executeQuery(sql); // 执行数据查询语句(select) :NHP,"
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); As5*)o"&
2)用PreparedStatement来执行sql语句 vS@;D7ep
String sql; <`PW4zSI
sql = "insert into user (id,name) values (?,?)"; }fS`jq;
PreparedStatement ps = cn.prepareStatement(sql); E}YJGFB7"
ps.setInt(1,xxx); *VP-fyJp
ps.setString(2,xxx); >EacXPt-O
... PUU
"k:{
ResultSet rs = ps.executeQuery(); // 查询 3Ygt!
int c = ps.executeUpdate(); // 更新 %ZKP d8
ApT8;F B
3、处理执行结果 ` FJ2
?
查询语句,返回记录集ResultSet 55%j$f
更新语句,返回数字,表示该更新影响的记录数 -za+Wa`vH
ResultSet的方法 5]c\{G
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ' F,.y6QU
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 b6]MJ0do
t9U-c5bR
4、释放连接 tPQjjoh
cn.close(); \f!j9O9S
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection nq/SGo[c
=x &"aF1
可滚动、更新的记录集 kWSei3
1、创建可滚动、更新的Statement 2#i*'.
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ZyJ-}[z
该Statement取得的ResultSet就是可滚动的 # $N)
2、创建PreparedStatement时指定参数 t7P[^f15[
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); f4mQDRlD
ResultSet.absolute(9000); ;2&ym)`
批量更新 :l;SG=scx
1、Statement d~|/LR5
Statement sm = cn.createStatement(); '5usPD
sm.addBatch(sql1); -ff@W m
sm.addBatch(sql2); i".nnAI:
... Ic<J]+Xq
sm.executeBatch() ;ndwVZ~,
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 4#MPD
2、PreparedStatement ,f[`C-\Q%
PreparedStatement ps = cn.preparedStatement(sql); tCVaRP8eC+
{ J#/L}h;qH
ps.setXXX(1,xxx); ,UveH` n-
... %v"qFYVX"
ps.addBatch(); ozCH1V{p
} qQ{i2D%)?f
ps.executeBatch(); VoGyjGt&
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ;_nV*G.y#^
-W\1n#J
事务的处理 n N_Ylw
1、关闭Connection的自动提交 ([#4H3uO-
cn.setAutoCommit(false); )q8!:Z
2、执行一系列sql语句 !vY5X2?tr,
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close &tjv.t
Statement sm ; R'z
-#*[
sm = cn.createStatement(insert into user...); YCBcyE}p
sm.executeUpdate(); S 9;:)
sm.close(); te*|>NRS
sm = cn.createStatement("insert into corp...); Py!
F
sm.executeUpdate(); wBJP8wES=
sm.close(); X }""=
S<
3、提交 Kqn{q4L
cn.commit(); . 1q4Q\B<
4、如果发生异常,那么回滚 !iHJ!
cn.rollback();