java 数据库基本操作 E<RPMd @a
1、java数据库操作基本流程 MHj
RPh
2、几个常用的重要技巧: {ooztC
可滚动、更新的记录集 FD'yT8]"
批量更新 cl04fqX
事务处理 #ZkT![`
Upw`|$1S
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 tNoPpIu
1、取得数据库连接 H^ 'As;R
1)用DriverManager取数据库连接 a\-AGG{2/X
例子 j%+>y;).
String className,url,uid,pwd; x" lcE@(
className = "oracle.jdbc.driver.OracleDriver"; 9Js+*,t
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; &R5zt]4d&
uid = "system"; "?%2`*\
pwd = "manager"; Ie4\d2tQ;
Class.forName(className); :%_\!FvS
Connection cn = DriverManager.getConnection(url,uid,pwd); +Jm~Um!
2)用jndi(java的命名和目录服务)方式 ) >te|@}o
例子 j)ME%17
String jndi = "jdbc/db"; R1$s1@3I|
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); E$.f AIt
DataSource ds = (DataSource) ctx.lookup(jndi); Upa F>,kM
Connection cn = ds.getConnection(); 71n3d~!O>
多用于jsp中 qCkC 2Fy(
2、执行sql语句 v]Fw~Y7l!
1)用Statement来执行sql语句 p$=Z0p4%LL
String sql; 6(=B`Z}a
Statement sm = cn.createStatement(); Al1_\vx7
sm.executeQuery(sql); // 执行数据查询语句(select) H +'6*akV
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); w_h{6Kc<
2)用PreparedStatement来执行sql语句 d.|*sZ&3p
String sql; dbJ3E)rF
sql = "insert into user (id,name) values (?,?)"; 4VF4 8
PreparedStatement ps = cn.prepareStatement(sql); /!?b&N/d)
ps.setInt(1,xxx); cJerYRjsL
ps.setString(2,xxx); r]@T9\9
... !(Ymc_s
ResultSet rs = ps.executeQuery(); // 查询 X1HEeJ|
int c = ps.executeUpdate(); // 更新 }.a{;{y
x<h|$$4S
3、处理执行结果 '_b3m2I.G
查询语句,返回记录集ResultSet zLgc j(;
更新语句,返回数字,表示该更新影响的记录数 ~&?57Sw*m
ResultSet的方法 uK]-m
1、next(),将游标往后移动一行,如果成功返回true;否则返回false + -uQ] ^n
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 et2;{Tb,5
X%mga~fB
4、释放连接 r+8)<Xt+p
cn.close(); yAAV,?:o[
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection #+QJ5VI:
uI$n7\G!
可滚动、更新的记录集 ~!S/{Un
1、创建可滚动、更新的Statement Llkh
kq_
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); IQ$!y,VJ
该Statement取得的ResultSet就是可滚动的 SwsJ<Dq^z
2、创建PreparedStatement时指定参数 wFF,rUV
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ^&D5J\][
ResultSet.absolute(9000); idB1%?<
批量更新 E
mg=,
1、Statement X::@2{-@y
Statement sm = cn.createStatement();
)ut$644R
sm.addBatch(sql1); Ni8%K6]z
sm.addBatch(sql2); (/At+MF3E
... ^vxx]Hji
sm.executeBatch() BTD_j&+(
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 EnGh&]
2、PreparedStatement &\I<j\F2/
PreparedStatement ps = cn.preparedStatement(sql); gg.]\#3g
{ B`.aQ
ps.setXXX(1,xxx); [(2^oTSRaq
... \pk9i+t
ps.addBatch(); dG7d}0Ou'
} ~n8UN<
ps.executeBatch(); 1d~d1Rd
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 b}fC'
h
O}%ES AB
事务的处理 T ay226
1、关闭Connection的自动提交 ?%`Ph ?BZl
cn.setAutoCommit(false); V@]SKbK}wN
2、执行一系列sql语句 GMg!2CIU
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close }]H7uC!t
Statement sm ; TE;f*!
sm = cn.createStatement(insert into user...); KTt+}-vP^
sm.executeUpdate(); L@z[b^
sm.close(); (u^8=#
sm = cn.createStatement("insert into corp...); r&Nh>6<&/
sm.executeUpdate(); YO-B|f
sm.close(); k;jl3GV
3、提交 yKuZJXGVo
cn.commit(); '$Z@oCY#
4、如果发生异常,那么回滚 sZ~03QvkT
cn.rollback();