java 数据库基本操作 ? Nj)6_&
1、java数据库操作基本流程 aq>?vti1D
2、几个常用的重要技巧: H
oy7RC&
可滚动、更新的记录集 {[#(w75R{
批量更新 8n)WW$
事务处理 ] f7#N
-;c
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 6SEltm(
1、取得数据库连接 <e"J4gZf&
1)用DriverManager取数据库连接 z/|BH^Vw
例子 w9~k]5
String className,url,uid,pwd; q? z>
className = "oracle.jdbc.driver.OracleDriver"; <4X?EYaTq
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; =:7$/T'Qg
uid = "system";
nB@UKX
pwd = "manager"; f6ZZ}lwaV
Class.forName(className); A|RR]CFJ
Connection cn = DriverManager.getConnection(url,uid,pwd); D(XqyN-P
2)用jndi(java的命名和目录服务)方式 4('JwZw\!
例子 k=n
"+
String jndi = "jdbc/db"; d]B=*7]
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Z6s5M{mE
DataSource ds = (DataSource) ctx.lookup(jndi); &"S/Lt
Connection cn = ds.getConnection(); ?l6jG
多用于jsp中 aC\4}i<
2、执行sql语句 NB)t7/Us
1)用Statement来执行sql语句 :=!Mh}i
String sql; DdjCn`jqlf
Statement sm = cn.createStatement(); YMzBAf
sm.executeQuery(sql); // 执行数据查询语句(select) Go8F5a@j
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); !D:k!
2)用PreparedStatement来执行sql语句 F@SG((`
String sql; *@M3p}',M
sql = "insert into user (id,name) values (?,?)"; /6tcSg)
PreparedStatement ps = cn.prepareStatement(sql); 3'#%c>_
ps.setInt(1,xxx); vDDljQXw4
ps.setString(2,xxx); aj7dH5SZl
... L(o#4YH}>J
ResultSet rs = ps.executeQuery(); // 查询 gA:TL{X0
int c = ps.executeUpdate(); // 更新 bx;f`8SN
[X"k>
Sq
3、处理执行结果 avNLV
查询语句,返回记录集ResultSet f_<Y\
更新语句,返回数字,表示该更新影响的记录数 |rPAC![=
ResultSet的方法 !#}>Hv^N
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ;93KG4a
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ww,Z )m
RaNeZhF>M
4、释放连接 [MmM 9J["
cn.close(); g9V.13k
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 5'
\)`
Y3oMh,
可滚动、更新的记录集 i?>Hr|
1、创建可滚动、更新的Statement *\q8BZ
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); rg)h5G
该Statement取得的ResultSet就是可滚动的 #+G`!<7/@f
2、创建PreparedStatement时指定参数 }~zO+Wf2
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Uf2:gLrF
ResultSet.absolute(9000); c E76L%O
批量更新 kK?zVH-!
1、Statement j#igu#MB*
Statement sm = cn.createStatement(); sR79
K1*j
sm.addBatch(sql1); 6VR[)T%
sm.addBatch(sql2); u4"r>e6_B
... <Jwo?[a
sm.executeBatch() L8P36]>
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 #v/ry)2Y=
2、PreparedStatement l>Av5g)
PreparedStatement ps = cn.preparedStatement(sql); wRbw
{ .TN2s\:]jw
ps.setXXX(1,xxx); l2/@<0P
... %$9:e
J?
ps.addBatch(); o;;,iHu*
} (,tHL
ps.executeBatch(); chLeq
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 w%u5<
n-OWwev)
事务的处理 .<w)Bmh
1、关闭Connection的自动提交 !sK#zAR2
cn.setAutoCommit(false); DQ_ 2fX~)
2、执行一系列sql语句 !R{em4 8D
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close r$DZkMue
Statement sm ; BE4\U_]a3
sm = cn.createStatement(insert into user...); W-Of[X{<
sm.executeUpdate(); ZNy9_a:dX
sm.close(); 6/7F">@j
sm = cn.createStatement("insert into corp...); jtLnj@,
sm.executeUpdate(); ^pw7o6}
sm.close(); =uc^433.
3、提交 ha>SZnKD{
cn.commit(); <9N4"d!A
4、如果发生异常,那么回滚 IUawdB5CB
cn.rollback();