java 数据库基本操作 8,O33qwH
1、java数据库操作基本流程 ;o/>JHGj
2、几个常用的重要技巧: $rXh0g
可滚动、更新的记录集 r[.>P$U
批量更新 obK*rdg,
事务处理 s%iOUL2/
}
B396X
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 '^%~JyU
1、取得数据库连接 SxyONp.$\
1)用DriverManager取数据库连接 w|mb4AyL{?
例子 ,:Vm6u!
String className,url,uid,pwd; :RSz4
className = "oracle.jdbc.driver.OracleDriver"; PUQES(&
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 4GG>!@|
uid = "system"; C=uZ1xg*,
pwd = "manager"; o }Tz"bN
Class.forName(className); E6Rz@"^XV
Connection cn = DriverManager.getConnection(url,uid,pwd); Y\],2[liF
2)用jndi(java的命名和目录服务)方式 y5= `ap
例子 TUT][
=.=
String jndi = "jdbc/db"; =O _z(
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); d1!i(MaV!
DataSource ds = (DataSource) ctx.lookup(jndi); ~zm7?_"@]
Connection cn = ds.getConnection(); jUj<~:Q}3o
多用于jsp中 TGuiNobD
2、执行sql语句 V~GWl1#7
1)用Statement来执行sql语句 ,=(Z00#(
String sql; xE}VTHFo'
Statement sm = cn.createStatement(); FZd.L6q
sm.executeQuery(sql); // 执行数据查询语句(select) Sj'ht=
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); O_$dI*RK
2)用PreparedStatement来执行sql语句 , "jbq~
String sql; pqvOJ#?Q}=
sql = "insert into user (id,name) values (?,?)"; $@\mpwANl
PreparedStatement ps = cn.prepareStatement(sql); yix'rA -T
ps.setInt(1,xxx); :"6q,W
ps.setString(2,xxx); | W$DVRA
... l5Y/Ok0,
ResultSet rs = ps.executeQuery(); // 查询
s6
( z
int c = ps.executeUpdate(); // 更新 ?#0snlah|
DPrBFmHF
3、处理执行结果 >}~#>Ru
查询语句,返回记录集ResultSet /wQL
更新语句,返回数字,表示该更新影响的记录数 ]DFXPV
ResultSet的方法 U,/6;}
1、next(),将游标往后移动一行,如果成功返回true;否则返回false eLwTaW !C
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 QU{Ech'
r8xyd"Axy
4、释放连接 * v8Ts
cn.close(); ~/_9P Fk
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection =1h9rlFj"D
jO9ip
可滚动、更新的记录集 _FbC{yI8;
1、创建可滚动、更新的Statement d-bqL:/
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ZaFb*XRgS
该Statement取得的ResultSet就是可滚动的 s"=6{EVqk3
2、创建PreparedStatement时指定参数 ?3z- _8#
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ;TQf5|R\K
ResultSet.absolute(9000); qZ@0]"h
批量更新 *fO3]+)d+
1、Statement 8T;IZ(s
Statement sm = cn.createStatement(); VS#wl|b8
sm.addBatch(sql1); QYXx:nIrg
sm.addBatch(sql2); I~PDaZP
... B}OY/J/*8
sm.executeBatch() Gx?+9CV
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 DPe]daF
2、PreparedStatement ^x*nq3^h\
PreparedStatement ps = cn.preparedStatement(sql); 6
y"-I!&
{ LL!.c
ps.setXXX(1,xxx); g}&hl"j
... k.h`Cji@
ps.addBatch(); W-RqN!snJ8
} 8pLBt:
ps.executeBatch(); IWVlrGyM
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 t<uYM
fBBa4"OK=
事务的处理 8$xPex~2
1、关闭Connection的自动提交 l>lW]W
cn.setAutoCommit(false); ]!1OH
|Ad
2、执行一系列sql语句 ?wMHS4
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close K*K1(_x=
Statement sm ; 5_K5?N
sm = cn.createStatement(insert into user...); qv
3^5d
sm.executeUpdate(); <Y 4:'L6
sm.close(); >-T`0wI
sm = cn.createStatement("insert into corp...); N;F)jO
xsl
sm.executeUpdate(); iMF<5fLH&
sm.close(); 'f8(#n=6qP
3、提交 >YW\~T
cn.commit(); '2J0>Bla
4、如果发生异常,那么回滚 s*M@%_A?
cn.rollback();