java 数据库基本操作 oSP^
.BJ$
1、java数据库操作基本流程 Ev&aD
2、几个常用的重要技巧: ^1XnnQa
可滚动、更新的记录集 ~bfjP2
g
批量更新 l{.
XhB
事务处理 Qa1G0qMEIF
Vje LPbk)
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 d^`n/"Ice
1、取得数据库连接 X&,a=#C^
1)用DriverManager取数据库连接 5WI0[7
例子 Chtls;Ph[
String className,url,uid,pwd; ET|4a(x
className = "oracle.jdbc.driver.OracleDriver"; , D`\
RV
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; YTfMYH=}
uid = "system"; JwUz4
pwd = "manager"; #F+b^WTR
Class.forName(className); !3o]mBH8
Connection cn = DriverManager.getConnection(url,uid,pwd); fJn4'Q*U
2)用jndi(java的命名和目录服务)方式 KPa&P:R3
例子 wr2F]1bh@
String jndi = "jdbc/db"; 5I5#LQv0
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); `e5f69"
DataSource ds = (DataSource) ctx.lookup(jndi); 6)9X+U@
Connection cn = ds.getConnection(); \ X;)Kt"
多用于jsp中 %UCuI9
2、执行sql语句 Fw6x
(j"
1)用Statement来执行sql语句 pbqJtBBDDS
String sql; do@BJWo
Statement sm = cn.createStatement(); @FuX^Q.[
sm.executeQuery(sql); // 执行数据查询语句(select) <2PO3w?Z
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); C6:;
T%
2)用PreparedStatement来执行sql语句 ra{HlB{
String sql; >orDw3xC
sql = "insert into user (id,name) values (?,?)"; {^Q1b.=
PreparedStatement ps = cn.prepareStatement(sql); xQ8?"K;iX
ps.setInt(1,xxx); \eS-wO7%
ps.setString(2,xxx); _({K6adb
... _^Q =n>G
ResultSet rs = ps.executeQuery(); // 查询 1$uO%
int c = ps.executeUpdate(); // 更新 9K#U<Q0b'
)7iYx {n
3、处理执行结果 (M,*R
v
查询语句,返回记录集ResultSet .p\<niu7
更新语句,返回数字,表示该更新影响的记录数 C-VkXk
ResultSet的方法 )n$RHt+:>
1、next(),将游标往后移动一行,如果成功返回true;否则返回false T28Q(\C:}
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 C?PgC~y)
E XQ3(:&
4、释放连接 $-_@MT~
cn.close(); Ga$EM
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection $:*/^)L
*iujJi
可滚动、更新的记录集 ]q@W(\I
1、创建可滚动、更新的Statement <{A |Xs
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); UC?i>HsJrX
该Statement取得的ResultSet就是可滚动的 (k>I!Z/&2
2、创建PreparedStatement时指定参数 P\.1w>X
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); O%busM$P)/
ResultSet.absolute(9000); 'U4@Sax,
批量更新 G+jcR; s
1、Statement yA-UXKT
Statement sm = cn.createStatement(); i>AKXJ+
sm.addBatch(sql1); <,(Ww
sm.addBatch(sql2); yyuf
... 8,&QY%8pX
sm.executeBatch() Z~ {[YsG
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 qvN 5[rb
2、PreparedStatement F$H^W@<w
PreparedStatement ps = cn.preparedStatement(sql); OEj%cB!
{ 7a'@NgiGg
ps.setXXX(1,xxx); 4(}V$#^+
... (khMjFOg
ps.addBatch(); {#uf#J|
} kI#yW!
ps.executeBatch(); y
;T=u(}
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 #6qLu
2W=am_\0e.
事务的处理 atjrn:X
1、关闭Connection的自动提交 )\0LxsZ
cn.setAutoCommit(false); YDo,9
2、执行一系列sql语句 EyPF'|Qtn
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Z<6Fq*I
Statement sm ; p+|(lrYC
sm = cn.createStatement(insert into user...); ;PG,0R`Z;
sm.executeUpdate(); ~0XV[$`L
sm.close(); <LOas$
sm = cn.createStatement("insert into corp...); 9/R<,
sm.executeUpdate(); }TAHVcX*p
sm.close(); naWW i]9
3、提交 >-<