java 数据库基本操作 E0r#xmk
1、java数据库操作基本流程 78Zb IL
2、几个常用的重要技巧: kbz+6LcV
可滚动、更新的记录集 =x^IBLHN
批量更新 xWQQX
事务处理 K^AIqL8
0#ePg6n
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 I%{D5.du
1、取得数据库连接 0[Zs8oRiI
1)用DriverManager取数据库连接 czo*_q%
例子 }`$({\^w
String className,url,uid,pwd; 0F 4%Xz
className = "oracle.jdbc.driver.OracleDriver"; viS7+E|O
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; %.IW H9P7
uid = "system"; Rwmr [g
pwd = "manager"; +{e2TY
Class.forName(className); )hA)`hL
F
Connection cn = DriverManager.getConnection(url,uid,pwd); ,}OQzK/"mP
2)用jndi(java的命名和目录服务)方式 8`b_,(\ N
例子
5&U?\YNLa
String jndi = "jdbc/db"; bb`DyUy ^+
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); MIAC'_<-e
DataSource ds = (DataSource) ctx.lookup(jndi); g31\7\)Ir
Connection cn = ds.getConnection(); 9@p+g`o
多用于jsp中 'khhn6itA
2、执行sql语句 wAF#N1-k
1)用Statement来执行sql语句 nfr..4,:
String sql; 2mvp|<"
Statement sm = cn.createStatement(); Mg^3Y'{o
sm.executeQuery(sql); // 执行数据查询语句(select)
-S}^b6WL
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 2I~a{:O
2)用PreparedStatement来执行sql语句 V@ph.)z
String sql; a*@4W3;7
sql = "insert into user (id,name) values (?,?)"; ,?!4P+ob
PreparedStatement ps = cn.prepareStatement(sql); M*jn8OE
ps.setInt(1,xxx); 3)py|W%X$
ps.setString(2,xxx); klC48l
... !RdubM
ResultSet rs = ps.executeQuery(); // 查询 ^pa -2Ao6
int c = ps.executeUpdate(); // 更新 {B6tGLt#bf
&f>1/"lnd\
3、处理执行结果 Q(YQ$i"S
查询语句,返回记录集ResultSet D~<0CQ3n.
更新语句,返回数字,表示该更新影响的记录数 3H/4$XJB
ResultSet的方法 iX'#~eK*<
1、next(),将游标往后移动一行,如果成功返回true;否则返回false T
.L>PL?=
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 k<NEauQ
J{5&L &4
4、释放连接 K~>ESMZ5
cn.close(); pSJc.j
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 7
S2QTRvH
&!FWo@
可滚动、更新的记录集 A 4|a{\|$
1、创建可滚动、更新的Statement (
u}tUv3
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); K F`@o@,
该Statement取得的ResultSet就是可滚动的 rwou[QU
2、创建PreparedStatement时指定参数 3DO
^vV
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); /F6=iHK(l
ResultSet.absolute(9000); d>NM4n[h8
批量更新 [S!_ubP5
1、Statement dg]: JU
Statement sm = cn.createStatement(); G+xdh
sm.addBatch(sql1); VlQaT7Q
sm.addBatch(sql2); Od:,r
... !G3d5d2)C
sm.executeBatch() #!X4\+)
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 zcNv T
2、PreparedStatement /!Ng"^.e
PreparedStatement ps = cn.preparedStatement(sql); S>pbplE
{ sC.aT(meJ
ps.setXXX(1,xxx); &qP&=( $
... Z>H
y+Q4
ps.addBatch(); 0
))W [
} ESl</"<J
ps.executeBatch(); !h0#es\
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 .UuCTH;6`
}vbs6u
事务的处理 n_/_Y>{M0
1、关闭Connection的自动提交 yJ&`@gB
cn.setAutoCommit(false); C"P40VQoo
2、执行一系列sql语句 }G#TYF}
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close czV][\5
Statement sm ; / b_C9'S
sm = cn.createStatement(insert into user...); IE-c^'W=}m
sm.executeUpdate(); ,wN>,(
sm.close(); S6r$n
sm = cn.createStatement("insert into corp...); (*Jcx:rH
sm.executeUpdate();
RTW4r9~'
sm.close(); F`$V H^%V
3、提交 Tc DkKa
cn.commit(); M@V.?;F},
4、如果发生异常,那么回滚 XJ|CC.]1u
cn.rollback();