java 数据库基本操作 YT)@&HaF
1、java数据库操作基本流程 _+.
)8
2、几个常用的重要技巧: AmBLZ<f;
可滚动、更新的记录集 "K#zY~>L
批量更新 =VF%Z[Gm
事务处理 \(ju0qFqH
9^^:Y3j
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 {@>6E8)H5
1、取得数据库连接 nH|7XY9"
1)用DriverManager取数据库连接 SHN'$f0Mb
例子 }&LLo
String className,url,uid,pwd; ^4{"h
className = "oracle.jdbc.driver.OracleDriver"; myDcr|j-a
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; <@+{EK'`q
uid = "system";
~ P!%i9e_
pwd = "manager"; 8Xz \,}$O
Class.forName(className); (r"2XXR
Connection cn = DriverManager.getConnection(url,uid,pwd); r*t\F&D
2)用jndi(java的命名和目录服务)方式 rY]QTS">o
例子 YFs!,fw'
String jndi = "jdbc/db"; {S5j;
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ,\D*=5
DataSource ds = (DataSource) ctx.lookup(jndi); h3P ^W(=&
Connection cn = ds.getConnection(); C7_#D O6"
多用于jsp中 :PQvt/-'(D
2、执行sql语句 zl!Y(o!@
1)用Statement来执行sql语句 AR7]~+X
String sql; *hkNJ
Statement sm = cn.createStatement(); a<v!5\dq!
sm.executeQuery(sql); // 执行数据查询语句(select) Wh1'?#
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close();
iKEHwm
2)用PreparedStatement来执行sql语句 +XL|bdK
String sql; zC_@wMWB
sql = "insert into user (id,name) values (?,?)"; "j?\Ze*
PreparedStatement ps = cn.prepareStatement(sql); 'SnB7Y
ps.setInt(1,xxx); JI|MR#_u
ps.setString(2,xxx); td(4Fw||1y
... 9NausE40
ResultSet rs = ps.executeQuery(); // 查询 |]j2T8_=
int c = ps.executeUpdate(); // 更新 0R}F(tjw
nBGcf(BE.$
3、处理执行结果 R9O1#s^
查询语句,返回记录集ResultSet Un\
T}
c
更新语句,返回数字,表示该更新影响的记录数 ^_JByBD
ResultSet的方法 Ep1p>s^
1、next(),将游标往后移动一行,如果成功返回true;否则返回false GJn ~x
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ?TY/'-M5
;BYv&(#u1q
4、释放连接 o/mGd~
cn.close(); YB"=eld
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection \Qei}5P,
z-?WU
可滚动、更新的记录集 c_FnJ_+ +f
1、创建可滚动、更新的Statement & _mp!&5XV
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 7aJ:kumDZ
该Statement取得的ResultSet就是可滚动的 [M&.'X
2、创建PreparedStatement时指定参数 oE'Flc.
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); =x}p>#o,J
ResultSet.absolute(9000); Qi\"b
批量更新 )UAkg
1、Statement ZA'Qw2fF0
Statement sm = cn.createStatement(); ) (l=_[1Z5
sm.addBatch(sql1); ~?uch8H
sm.addBatch(sql2); m-XS_5x\
... tqicyNL
sm.executeBatch() `E-cf 7%
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 R6-Z]Hu
2、PreparedStatement _/cL"Wf
PreparedStatement ps = cn.preparedStatement(sql); {}N=pL8MS
{ n_@cjO
ps.setXXX(1,xxx); pEX|zee
... ><"0GPxrx
ps.addBatch(); J|:Zs1.<d
} {Q
AV
ps.executeBatch(); ^6FU]
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 wUcp_)aE|
5yQ\s[;o3
事务的处理 _p\O!y
1、关闭Connection的自动提交 #w&N)
c>
cn.setAutoCommit(false); %S]g8O[}nl
2、执行一系列sql语句 wvlM(
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close V25u_R`{
Statement sm ; p
_q]Rt
sm = cn.createStatement(insert into user...); 1eMz"@Q9
sm.executeUpdate(); >PoVK{&y
sm.close(); qfsu# R
sm = cn.createStatement("insert into corp...); RzN9pAe
sm.executeUpdate(); ?$Ii_.
sm.close(); zM!2JC
3、提交 -VkPy<)
cn.commit(); v `7` '
4、如果发生异常,那么回滚 N_| '`]D
cn.rollback();