java 数据库基本操作 qkZ5+2m
1、java数据库操作基本流程 'Kt4O9=p
2、几个常用的重要技巧: U>3%!83kF
可滚动、更新的记录集 $A5B{2
批量更新 soFvrl^Ql+
事务处理 J7&.>y1%
o{YW
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ~ ]m@k'n
1、取得数据库连接 dd
@COP?
1)用DriverManager取数据库连接 qW` XA
例子 .$}Z:,aB
String className,url,uid,pwd; 8H$@Xts
className = "oracle.jdbc.driver.OracleDriver"; .3g\[p
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; tOlzOBzR
uid = "system"; XQ+-+CD
pwd = "manager"; ps{&WT3a
Class.forName(className); OmoplJ+
Connection cn = DriverManager.getConnection(url,uid,pwd); ^|a&%wxA
2)用jndi(java的命名和目录服务)方式 lL(}dbT~N
例子 lhW#IiX
String jndi = "jdbc/db"; +lXdRc`6
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); qAuUe=w%p
DataSource ds = (DataSource) ctx.lookup(jndi); s\3Z?zm8
Connection cn = ds.getConnection(); ux/[d6To
多用于jsp中 A+bubH,
2、执行sql语句 ;{F;e)${M
1)用Statement来执行sql语句 o#KPrW`XJ/
String sql; 8m13M5r
Statement sm = cn.createStatement(); ?L~=Z\H
sm.executeQuery(sql); // 执行数据查询语句(select) )=SYJ-ta<
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); }X W#?l
2)用PreparedStatement来执行sql语句 @zVBn~=i
String sql; "8C(_z+]K`
sql = "insert into user (id,name) values (?,?)"; k*UR#z(I
PreparedStatement ps = cn.prepareStatement(sql); :BrnRW64
ps.setInt(1,xxx); %l]rQjV-
ps.setString(2,xxx); `)gkkZ$)j
... W0r5D9k
ResultSet rs = ps.executeQuery(); // 查询 n<"a+TTU
int c = ps.executeUpdate(); // 更新 M%Kx{*aw&
'piF_5(@
3、处理执行结果 B2Awdw3=g
查询语句,返回记录集ResultSet b$$L]$q2
更新语句,返回数字,表示该更新影响的记录数 6r-<XNv)0
ResultSet的方法 /n<Ncf
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 9O0
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 j{Qbzczy,
jW+VUF-t
4、释放连接 }1^tK(Am
cn.close(); ?6l,
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection VHXR)}
$4ZDT]n
可滚动、更新的记录集 m= beB\=
1、创建可滚动、更新的Statement _QtQPK\+
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); s'fcAh,c6
该Statement取得的ResultSet就是可滚动的 t9-\x
2、创建PreparedStatement时指定参数 Fy+7{=?^F
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 3!L<=X
ResultSet.absolute(9000); E )Zd{9A5)
批量更新 Aaw:B?4)
1、Statement fU){]YP
Statement sm = cn.createStatement(); {u[K
^G
sm.addBatch(sql1); _R!!4Hp<Q
sm.addBatch(sql2); .AQ3zpy5B
... y [7xK}`_
sm.executeBatch() `'k's]Y
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 S r#fyr
2、PreparedStatement iJp!ROI
PreparedStatement ps = cn.preparedStatement(sql); Ul~}@^m]4}
{ Ivgwm6M
ps.setXXX(1,xxx); V44sNi
... =*)O80oaW
ps.addBatch(); P A+e= %
} n*8RYm)?
ps.executeBatch(); Dm`U|<o
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 0_xcrM
bU +eJU_%
事务的处理 J;]@?(
1、关闭Connection的自动提交 (k HQKQmq
cn.setAutoCommit(false); YI(OrR;V
2、执行一系列sql语句 :Tl6:=B
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close sCf(h
Statement sm ; }JTgj
sm = cn.createStatement(insert into user...); }mS0{rxD4
sm.executeUpdate(); 1X:whS5S
sm.close(); A,CPR0g%
sm = cn.createStatement("insert into corp...);
0{Ll4
sm.executeUpdate(); t;~`Lm@hY
sm.close(); kGTc~p(
3、提交 z(#hL-{c
cn.commit(); 9,a,A6xry
4、如果发生异常,那么回滚 7J_f/st
cn.rollback();