java 数据库基本操作 QEVjXJOt0
1、java数据库操作基本流程 YP6+o#==
2、几个常用的重要技巧: %8ul}}d9
可滚动、更新的记录集 |`|b&Rhu
批量更新 U!Lws#\X
事务处理 j04Q3d
\f
e#AB0-f
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 qj|GAGrQ2
1、取得数据库连接 q\~7z1
1)用DriverManager取数据库连接 D Lu]d$G
例子
i"b*U5k
String className,url,uid,pwd; Y8d%L;b[D
className = "oracle.jdbc.driver.OracleDriver"; YONg1.^!(
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; JmBYD[h,
uid = "system"; *)w
8fq
pwd = "manager"; J:>TV.TP
Class.forName(className); xS.0u"[
Connection cn = DriverManager.getConnection(url,uid,pwd); u/MIB`@,
2)用jndi(java的命名和目录服务)方式 * T-XslI
例子 *8Lym,]
String jndi = "jdbc/db"; kTzZj|l^\
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); PvM<#zq_
DataSource ds = (DataSource) ctx.lookup(jndi); @<YZa$`
Connection cn = ds.getConnection(); d ][E;$
多用于jsp中 IL~yJx_11
2、执行sql语句 iD\joh-C
1)用Statement来执行sql语句 +EFurdX\
String sql; zJ\I%7h*
Statement sm = cn.createStatement(); {S}/LSNB
sm.executeQuery(sql); // 执行数据查询语句(select) F[+sc Mx!G
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); )TWf/Lcp
2)用PreparedStatement来执行sql语句 c>^_4QQ
String sql; c{E-4PYbah
sql = "insert into user (id,name) values (?,?)"; [fb -G5x
PreparedStatement ps = cn.prepareStatement(sql); 8xNKVj)@
ps.setInt(1,xxx); mr;WxxO5
ps.setString(2,xxx); A[b'MNsv
... x&f?c=\F
ResultSet rs = ps.executeQuery(); // 查询 >1r>cZn
int c = ps.executeUpdate(); // 更新 7#RW4ZM
Ghj6&K%b0
3、处理执行结果 ,^'Y7"
查询语句,返回记录集ResultSet KL xg
更新语句,返回数字,表示该更新影响的记录数 wCdUYgsPT"
ResultSet的方法 ubgq8@;
1、next(),将游标往后移动一行,如果成功返回true;否则返回false "XH]B
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 TEYbB=.
gC'GZi^
4、释放连接 -wO`o<
cn.close(); # ><.zZ
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Ao,lEjN I
{!,+C0
可滚动、更新的记录集 ='mqfGRi>
1、创建可滚动、更新的Statement k'{lo_
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); u-? &~WA
该Statement取得的ResultSet就是可滚动的 a E#s#Kv
2、创建PreparedStatement时指定参数 =e4,)Wd9&
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ve>8vw2
ResultSet.absolute(9000); Ar\`OhR
批量更新 #3qkG)
1、Statement {u!,TDt*
Statement sm = cn.createStatement(); g'I S8@
sm.addBatch(sql1); 5ogbse"
sm.addBatch(sql2); DZ EA*E >
... C|>#|5XaF
sm.executeBatch() h+vKai
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 dCc*<S
2、PreparedStatement
:&Ul
PreparedStatement ps = cn.preparedStatement(sql); ';
qT
{ Hv%a\WNS1
ps.setXXX(1,xxx); & MAIm56~
... iA:CPBv_mu
ps.addBatch(); b)df V=
} c xX
ps.executeBatch(); DO0["O74
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 |S.-5CAh4
Y H?>2u
事务的处理 pE=wP/#
1、关闭Connection的自动提交 8*|@A6ig
cn.setAutoCommit(false); 2Ay2
G-
2、执行一系列sql语句 q k !Q2W
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close O ~"^\]\
Statement sm ; 9zX\ioT
sm = cn.createStatement(insert into user...); F[J;u/Z
sm.executeUpdate(); 7%o\O{,U
sm.close(); -
@
sm = cn.createStatement("insert into corp...); =EIsqk^*
sm.executeUpdate(); Hiw{1E:rW
sm.close(); OnD+/I
3、提交 k1]?d7g$w
cn.commit(); r*kk/$,2
4、如果发生异常,那么回滚 n9)/(=)>*
cn.rollback();