java 数据库基本操作 ~BCSm]j
1、java数据库操作基本流程 ~Dr/+h:^\
2、几个常用的重要技巧: gcr,?rE<
可滚动、更新的记录集 zQxZR}'
批量更新 AO;`k]0e
事务处理 +-,Q>`
IoNZ'g?d
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 MoA2Cp;8X
1、取得数据库连接 GFvZdP`s4
1)用DriverManager取数据库连接 ,
j,[4^
例子 '6{q;Bxo
String className,url,uid,pwd; 1rC8]M.N
className = "oracle.jdbc.driver.OracleDriver"; Ig1cf9 :
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 9A\J*OU
uid = "system"; VS^%PM#:/
pwd = "manager"; }jTE gog
Class.forName(className); Js qze'BGY
Connection cn = DriverManager.getConnection(url,uid,pwd); )8&Q.? T
2)用jndi(java的命名和目录服务)方式 -$;H_B+.
例子 C 0*k@kGy
String jndi = "jdbc/db"; 6KhHS@Z
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); GZQ)TzR
DataSource ds = (DataSource) ctx.lookup(jndi); r4NI(\gU
Connection cn = ds.getConnection(); 7&NRE"?G
多用于jsp中 q=bJ9iJsq
2、执行sql语句 qsFA~{o.
1)用Statement来执行sql语句 oypq3V=5
String sql; MLmc]nL=
Statement sm = cn.createStatement(); }*$-rieg
sm.executeQuery(sql); // 执行数据查询语句(select) ".v9#|
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); >U"f1q*$
2)用PreparedStatement来执行sql语句 .x6*9z#q
String sql; %xLziF
sql = "insert into user (id,name) values (?,?)"; +d\"n
PreparedStatement ps = cn.prepareStatement(sql); 1SkGG0
W
ps.setInt(1,xxx); BmUEo$w
ps.setString(2,xxx); 4cJ^L <
... i[d-n/)
ResultSet rs = ps.executeQuery(); // 查询 KBzEEvx/$
int c = ps.executeUpdate(); // 更新 =0,")aa!
{exF"ap
3、处理执行结果 0$&Z_oJ
查询语句,返回记录集ResultSet \ ;Hj,z\
更新语句,返回数字,表示该更新影响的记录数 >?M:oUVDU
ResultSet的方法 G#duZNBdc
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 60~{sk~E
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 *~ 4uF
ekI1j%fO
4、释放连接 ` ]WU=Ss
cn.close(); (0D0G-r:
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection *|$s0ga C
F#4?@W
可滚动、更新的记录集 tK{`?NS
1、创建可滚动、更新的Statement zo@>~G3$9
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); o'myo.k{
该Statement取得的ResultSet就是可滚动的 &[I#5bGk
2、创建PreparedStatement时指定参数 }?*:uf
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); L7n->8Qk
ResultSet.absolute(9000); !i_5XcH
批量更新 lhQ*;dMj%"
1、Statement 2|EHNy!
Statement sm = cn.createStatement(); BAmH2"
sm.addBatch(sql1); 6$SsdT|8B
sm.addBatch(sql2); ]lQhIf6)k
... '4HwS$mW3
sm.executeBatch() E3,Z(dpX!
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 w
\0=L=J
2、PreparedStatement 9]|[z{v'>l
PreparedStatement ps = cn.preparedStatement(sql); E_WiQ?p
{ 0plRsZ}
ps.setXXX(1,xxx); I"sKlMD
... l:Ci'=
ps.addBatch(); TKoO\\
} N
Ja]UZx
ps.executeBatch(); { +
[rJ_
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 3dadeu^{A
,PRM(n -
事务的处理 =h&DW5QC
1、关闭Connection的自动提交 X@x:
F|/P
cn.setAutoCommit(false); pl fz)x3
2、执行一系列sql语句 4,H}'@Db}
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close FjiLc=RXXz
Statement sm ; ?Dd2k%o
sm = cn.createStatement(insert into user...); BT d$n!'$n
sm.executeUpdate(); ]N1$ioC#
sm.close(); +t.T+`
EG
sm = cn.createStatement("insert into corp...); A!iH g__/t
sm.executeUpdate(); gADt%K2#Z
sm.close(); S)g5Tu)
3、提交 L=Dx$#|
cn.commit(); MrOW&7
4、如果发生异常,那么回滚 *i5&x/ds
cn.rollback();