java 数据库基本操作 l`-bFmpA
1、java数据库操作基本流程 wd(Hv
2、几个常用的重要技巧: BvrB:%_:
可滚动、更新的记录集 D}C,![
批量更新 ?ULo&P[
事务处理 z+ a%5J
'})0!g<Y
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 3bZIYF2@
1、取得数据库连接 ORXm&z)
1)用DriverManager取数据库连接 wa=uUM_4u^
例子 3@Z#.FV~C[
String className,url,uid,pwd; 7R#+Le)
className = "oracle.jdbc.driver.OracleDriver"; _p-t<ytnh
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; jOpcV|2
uid = "system"; 9+s.w25R
pwd = "manager"; ml|W~-6l
Class.forName(className); >odbOi+X
Connection cn = DriverManager.getConnection(url,uid,pwd); ?Iyo9&1&
2)用jndi(java的命名和目录服务)方式 )}vNOE?X~
例子 ps
.]N
String jndi = "jdbc/db"; 'J&f%kx"
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); v[plT2"s
DataSource ds = (DataSource) ctx.lookup(jndi); mGUO6>g
Connection cn = ds.getConnection(); OA/WtQ5
多用于jsp中 |tR
OL9b
2、执行sql语句 v:Tzv^
1)用Statement来执行sql语句 U7uKRv9
String sql; =0;}K@(J
Statement sm = cn.createStatement(); 4'4\,o
sm.executeQuery(sql); // 执行数据查询语句(select) iy.2A!f^.
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ,lA.C%4au~
2)用PreparedStatement来执行sql语句 P}ok*{"J<>
String sql; Z[\O=1E,
sql = "insert into user (id,name) values (?,?)"; pD]0`L-HJU
PreparedStatement ps = cn.prepareStatement(sql); 0;4t&v7
ps.setInt(1,xxx); @_:]J1jw7
ps.setString(2,xxx); ~_s?k3cd
... u]u[(K5F
ResultSet rs = ps.executeQuery(); // 查询 OouPj@r
int c = ps.executeUpdate(); // 更新 [gy*`@w
T,xPSN2A*
3、处理执行结果 *_E|@y
查询语句,返回记录集ResultSet cLPkK3O\=
更新语句,返回数字,表示该更新影响的记录数 K7Rpr.p
ResultSet的方法 >9RD_QG7
1、next(),将游标往后移动一行,如果成功返回true;否则返回false {u1V|q
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 aLJ(?8M@
)ZrS{vY
4、释放连接 :=%0Mb:
cn.close();
t#%R
q
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection '>$]{vQ3
E0%~!b
可滚动、更新的记录集 s&\I=J.
1、创建可滚动、更新的Statement B+^(ktZp@
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); \AL
f$88>@
该Statement取得的ResultSet就是可滚动的 !RyO\>:q
2、创建PreparedStatement时指定参数 \#o2\!@`
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); /%_OW@ ?
ResultSet.absolute(9000); '13ZX:
批量更新 ) ri}nL.
1、Statement p.+ho~sC,.
Statement sm = cn.createStatement(); bAKiq}xG%i
sm.addBatch(sql1); 3^s/bm$g
sm.addBatch(sql2);
Bs?7:kN(
... 1]orUF&_
sm.executeBatch() 54
> -
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 7jnIv];i
2、PreparedStatement %dQxJMwj
PreparedStatement ps = cn.preparedStatement(sql); +f*OliMD
{ ^c:Fy+fb
ps.setXXX(1,xxx); meN2ZB?Y
... "D?z
ps.addBatch(); z]b>VpW:
} |t; ~:A
ps.executeBatch(); G8Nt
8U~
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 nqwAQhzy(
6s0_#wZC
事务的处理 c@v{`d
1、关闭Connection的自动提交 (JM4R8fR&
cn.setAutoCommit(false); %tG*C,l]
2、执行一系列sql语句 22f`LoM
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close b~nAPY6
Statement sm ; OKFtl
sm = cn.createStatement(insert into user...); 4C}bJzZ
sm.executeUpdate(); +}f9
sm.close(); LM&y@"wfm
sm = cn.createStatement("insert into corp...); ~z" =G5|
sm.executeUpdate(); @6l%,N<fou
sm.close(); D#&q&6P{
3、提交 nLV9<M
Zm
cn.commit(); y*D]Q`5cag
4、如果发生异常,那么回滚 \GHiLs,!
cn.rollback();