java 数据库基本操作 WI4<2u;
1、java数据库操作基本流程 'o6}g p)
2、几个常用的重要技巧: 7H)$NG<U$
可滚动、更新的记录集 ,eBC]4)B6
批量更新 b"A,q
事务处理 0t?o6e
o3dqsQE%
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 UP^8Yhdo
1、取得数据库连接 !{r2`d09n)
1)用DriverManager取数据库连接 @Suz-j(H
例子 f]8MdYX(
String className,url,uid,pwd; ?VNtT/
className = "oracle.jdbc.driver.OracleDriver"; f~T7?D0u}N
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; V. &F%(L
uid = "system"; /Ne#{*z)hO
pwd = "manager"; GZ~Tl0U
Class.forName(className); `=H*4I-"
Connection cn = DriverManager.getConnection(url,uid,pwd); ##6\~!P
2)用jndi(java的命名和目录服务)方式 .p!
DVQ"a
例子 YK)m6zW5
String jndi = "jdbc/db"; gMI%!Y
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); }yK7LooM
DataSource ds = (DataSource) ctx.lookup(jndi); x6`mv8~9Db
Connection cn = ds.getConnection(); HP.=6bJWi
多用于jsp中 R>O_2`c
2、执行sql语句 H[u9C:}9b
1)用Statement来执行sql语句 gZ4'
w`4r
String sql; sNDo@u7
Statement sm = cn.createStatement(); PP$sdmo
sm.executeQuery(sql); // 执行数据查询语句(select) (M$0'BV0
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); IqYJ
2)用PreparedStatement来执行sql语句 _#sy
String sql; uP'L6p5
sql = "insert into user (id,name) values (?,?)"; uC;_?Bve
PreparedStatement ps = cn.prepareStatement(sql); 3<&:av3
ps.setInt(1,xxx); YSeH;<'
ps.setString(2,xxx); MvpJ0Y (
... RG{T\9]n
ResultSet rs = ps.executeQuery(); // 查询 9s^$tgH
int c = ps.executeUpdate(); // 更新 QMBT8x/+_'
bFX{|&tHU
3、处理执行结果 KAClV%jP
查询语句,返回记录集ResultSet qR'FbI
更新语句,返回数字,表示该更新影响的记录数 !b+4[xky
ResultSet的方法 Zu.hcDw1
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ,!l _
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 &`I(QY
T&_&l;syA
4、释放连接 #gQn3.PX+y
cn.close(); ByY2KJ7
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection RqTO3Kf
8TFQ%jv
可滚动、更新的记录集 wnokP
1、创建可滚动、更新的Statement Ei_~K';
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); cF8
2wg
该Statement取得的ResultSet就是可滚动的 _/LGGt4&%
2、创建PreparedStatement时指定参数 f\hMTebma$
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ]?4;Lw
ResultSet.absolute(9000); ~o!-[
批量更新 Vx $;wU Y
1、Statement %Xd*2q4*
Statement sm = cn.createStatement(); 'Tm1Mh0Fso
sm.addBatch(sql1); ,GH`tK_
sm.addBatch(sql2); n{;Q"\*Sg
... 0 #8
sm.executeBatch() i\6CE|
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 DEZww9T2Qs
2、PreparedStatement {nV/_o$$
PreparedStatement ps = cn.preparedStatement(sql); 49MEGl;K0\
{ F"]P|
ps.setXXX(1,xxx); - Z,Qj"V
... L[Vk 6e
ps.addBatch(); *SNdU^!
} \P.h;|u
ps.executeBatch(); G]=z
![$
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 _Q5mPBO
1(o\GI3:
事务的处理 !1)aie+p6
1、关闭Connection的自动提交 ",b:rgpRp
cn.setAutoCommit(false); Dx-P]j)4x
2、执行一系列sql语句 x]c8?H9,&
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Ocdy;|&
Statement sm ; yl-:9|LT
sm = cn.createStatement(insert into user...); LU:xmDv
sm.executeUpdate(); ,R[$S"]!SH
sm.close(); UGPDwgq\v
sm = cn.createStatement("insert into corp...); Vu5?;|^:
sm.executeUpdate(); :oIBJ u%/
sm.close(); %)lp]Y33
3、提交 3IMvtg
cn.commit(); [
\_o_W
4、如果发生异常,那么回滚 : .x((
FU
cn.rollback();