java 数据库基本操作 ;O}%SCF7
1、java数据库操作基本流程 =6~
2、几个常用的重要技巧: ?"Ez
可滚动、更新的记录集 ;<M}ZL@m
批量更新 Ikdj?"+O
事务处理 gkd4)\9
gk|>E[.
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 oJ4HvrUO
1、取得数据库连接 KM;H '~PZi
1)用DriverManager取数据库连接 ,1{qZ(l1
例子 jc"sPr v5
String className,url,uid,pwd; (}39f
className = "oracle.jdbc.driver.OracleDriver"; 6=/sEz S'
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; J3mLjYy
uid = "system"; &<;T$Y
pwd = "manager"; vqN/ crJ@
Class.forName(className); DP@1to@
Connection cn = DriverManager.getConnection(url,uid,pwd); /Z6lnm7wJ
2)用jndi(java的命名和目录服务)方式 B/;>v
例子 _[R(9KyF0f
String jndi = "jdbc/db"; jkL=JAcf~
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); bJIYe ld
DataSource ds = (DataSource) ctx.lookup(jndi); %4nf(|8n
Connection cn = ds.getConnection(); )9nW`d+
多用于jsp中 I#2$CSJ
2、执行sql语句
'6M6e(
1)用Statement来执行sql语句 486\a
String sql; b1?^9c#0d
Statement sm = cn.createStatement(); ?(gha
sm.executeQuery(sql); // 执行数据查询语句(select) g)#?$OhP"
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); dM;\)jm
2)用PreparedStatement来执行sql语句 c
K\
String sql; xeFx!$3
sql = "insert into user (id,name) values (?,?)"; !An?<Sv$
PreparedStatement ps = cn.prepareStatement(sql); fM ID}S
ps.setInt(1,xxx); }!_z\'u
ps.setString(2,xxx); NfClR HpVc
... !\7M7
ResultSet rs = ps.executeQuery(); // 查询 ~6;I"0b5
int c = ps.executeUpdate(); // 更新 F- -g?Q^
D>y5&`
3、处理执行结果 @/^<9
查询语句,返回记录集ResultSet Zye04&x9k
更新语句,返回数字,表示该更新影响的记录数 "Ol:ni1
ResultSet的方法 B{)#A?Rh.
1、next(),将游标往后移动一行,如果成功返回true;否则返回false >T]9.`xhK
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 DP),~8
#//xOL3J
4、释放连接 &9flNoNR9
cn.close(); P*!`AWn
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection JH\:9B+:L
2H%lN`
可滚动、更新的记录集 F\r"Y)|b=
1、创建可滚动、更新的Statement v)Y)tu>
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); K@7%i|H
该Statement取得的ResultSet就是可滚动的 U*~-\jN1pb
2、创建PreparedStatement时指定参数 ,
@jtD*c)
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); DujVV(+I
ResultSet.absolute(9000); LG:k}z/T
批量更新 6]iU-k0b
1、Statement W+a/>U
Statement sm = cn.createStatement(); #A5X,-4G
sm.addBatch(sql1); ^0v3NG6
sm.addBatch(sql2); W!<7OA g $
... C_N|o|dX
sm.executeBatch() Z
01A~_
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 [p6:uNo
2、PreparedStatement ]B )nN':
PreparedStatement ps = cn.preparedStatement(sql); c?CD;Pk
{ >>T7;[h
ps.setXXX(1,xxx); jVnTpa!A
... {3
ps.addBatch(); S%MDQTM
} HVus\s\&y%
ps.executeBatch(); ZRf9 'UwS
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 u~OlJ1V
T!,5dt8L
事务的处理 ,;t:x|{%
1、关闭Connection的自动提交 _]*YSeh=
cn.setAutoCommit(false); JxinfWk
2、执行一系列sql语句 B}TY+@
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close i6HRG\9nU
Statement sm ; ~qqxHymc
sm = cn.createStatement(insert into user...); <<LLEdB
sm.executeUpdate(); bRu9*4t
sm.close(); Z5v_- +K
sm = cn.createStatement("insert into corp...); r\"R?P$y|
sm.executeUpdate(); b[:,p?:@
sm.close(); =
zmxki
3、提交 >fYcr#i0[
cn.commit(); $\ZWQct
4、如果发生异常,那么回滚 fJ8>nOh
cn.rollback();