java 数据库基本操作 xsdi\
j;n>
1、java数据库操作基本流程 $/;;}|hqi
2、几个常用的重要技巧: G^/8lIj
可滚动、更新的记录集 JQ]A"xTIa*
批量更新 &>%9JXU
事务处理 O0,=@nw8.
E >lW'
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 /%w3(e
1、取得数据库连接 |jE0H!j
1)用DriverManager取数据库连接 ww$Ec
例子 ?mJ&zf|B8
String className,url,uid,pwd; h1.<\GO
className = "oracle.jdbc.driver.OracleDriver"; ]<IK0
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; L4-v'Z;
uid = "system"; t bEJyA
pwd = "manager"; &i?>mt
Class.forName(className); r5S5;jL%t
Connection cn = DriverManager.getConnection(url,uid,pwd); c.eA]m q
2)用jndi(java的命名和目录服务)方式 ct![eWsuB
例子 79O'S du@
String jndi = "jdbc/db"; 8xN+LL'T{
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); e.jbFSnA
DataSource ds = (DataSource) ctx.lookup(jndi); :J6lJ8w
?
Connection cn = ds.getConnection(); TdWatvY5p
多用于jsp中 D>efr8Qd@
2、执行sql语句 QNesiV0MI
1)用Statement来执行sql语句 q,v)X
String sql; XPQY*.l&.
Statement sm = cn.createStatement(); y$C\b\hM
sm.executeQuery(sql); // 执行数据查询语句(select) ];8S<KiS~
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); #cy;((z uB
2)用PreparedStatement来执行sql语句 5isqBu
String sql; =/SBZLR(9
sql = "insert into user (id,name) values (?,?)"; Ek%mX"
PreparedStatement ps = cn.prepareStatement(sql); dcbE<W#ss
ps.setInt(1,xxx); GP{$w_'!J0
ps.setString(2,xxx); K@>($BX]
... RJk4 2;]
ResultSet rs = ps.executeQuery(); // 查询 1E]TH/JK
int c = ps.executeUpdate(); // 更新 ^ ^T e
!$L~/<&0g
3、处理执行结果 y0_z_S#gO
查询语句,返回记录集ResultSet 3P2x%G p
更新语句,返回数字,表示该更新影响的记录数 AMf{E
ResultSet的方法 qe<aJn
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 2U.'5uA"L
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Hx#1TqC/
%v)O!HC}
4、释放连接 PEDV9u[A
cn.close(); o4F(X0
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection >&%#`PKT
[Lal_}m?
可滚动、更新的记录集 hYB3tT
1、创建可滚动、更新的Statement bAS/cuZs
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 5-?*Boi>i
该Statement取得的ResultSet就是可滚动的 ~6Pv5DKq
2、创建PreparedStatement时指定参数 *r(Qy0(
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 5/YGu=,
ResultSet.absolute(9000); _2
oZhJ
批量更新
WiiAIv&
1、Statement |e{ ^Yf4
Statement sm = cn.createStatement(); JpE7"Z"~MS
sm.addBatch(sql1); i#bcjH
sm.addBatch(sql2); '|J~2rbyr
... / ?Hq
sm.executeBatch() Aa4 DJ
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 xVN(It7g
2、PreparedStatement A"i$.dR{
PreparedStatement ps = cn.preparedStatement(sql); _|VF^\i
{ tE WolO[\
ps.setXXX(1,xxx); )}lO%B'K
... P"f4`q
ps.addBatch(); ToR@XL!%rP
}
!U=o<)I
ps.executeBatch(); e?_uJh"
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 V
`7(75
bJoP@s
事务的处理 weC.kx
1、关闭Connection的自动提交 (lg~}Jwq
cn.setAutoCommit(false); Pl\NzB,`
2、执行一系列sql语句 /tj_WO_
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close "</A)y&
Statement sm ; =z!/:M
sm = cn.createStatement(insert into user...); t?wVh0gT
sm.executeUpdate(); Q6;bORN
sm.close(); LK+67Y{25
sm = cn.createStatement("insert into corp...); |eI!wgQx
sm.executeUpdate(); ~J HEr48
sm.close(); bT15jNa
3、提交 %>!W+rO,
cn.commit(); 4Z.Dz@.c(
4、如果发生异常,那么回滚 GIhX2EvAS
cn.rollback();