java 数据库基本操作 y!S^xS
1、java数据库操作基本流程 C@ FxB[
2、几个常用的重要技巧: &\&'L|0F
可滚动、更新的记录集 `ajx hp
批量更新 nA>*IU[
事务处理 "w;08TX8
40 Au9o
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 86/. 8
1、取得数据库连接 2y^Uk,g
1)用DriverManager取数据库连接 t G]N*%@
例子 .H
Fc9^.*
String className,url,uid,pwd; <"N:rn{Qq
className = "oracle.jdbc.driver.OracleDriver"; k&O C&
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; DD2adu^
uid = "system"; <H<!ht%q3
pwd = "manager"; ,r@xPZPz:e
Class.forName(className); =\M)6"}y}
Connection cn = DriverManager.getConnection(url,uid,pwd); y^9bfMA
2)用jndi(java的命名和目录服务)方式 +IvNyj|
例子 <BZ_ (H
String jndi = "jdbc/db"; jh>N_cp
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); (viWY
DataSource ds = (DataSource) ctx.lookup(jndi); 7kdeYr~<1
Connection cn = ds.getConnection(); HB%K|&!+
多用于jsp中 Og+)J9#
2、执行sql语句 ol50d73B
1)用Statement来执行sql语句 %WZ$]M?q
String sql; u',b1 3g(
Statement sm = cn.createStatement(); wqcDAO(
sm.executeQuery(sql); // 执行数据查询语句(select) {JXf*IJ
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 1bd$XnU
2)用PreparedStatement来执行sql语句 #kj~G]QA
String sql; ;;M"hI3@
sql = "insert into user (id,name) values (?,?)"; 5~QhX22
PreparedStatement ps = cn.prepareStatement(sql); b)d^ `J
ps.setInt(1,xxx); 2H6:np|O
ps.setString(2,xxx); su}&".e^
... ~)_K"h.DY
ResultSet rs = ps.executeQuery(); // 查询 ?5`{7daot
int c = ps.executeUpdate(); // 更新 3+e4e
'|_/lz$h
3、处理执行结果 |hc\jb
查询语句,返回记录集ResultSet 7"#f!.E
更新语句,返回数字,表示该更新影响的记录数 0',[J
ResultSet的方法 uj)yk*
1、next(),将游标往后移动一行,如果成功返回true;否则返回false
"3wv:BL
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ^}hJL7O'
as(; ]
4、释放连接 dIvy!d2l
cn.close(); nX )f'[ 7
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ewpig4
RB IOdz
可滚动、更新的记录集 l~NEGb
1、创建可滚动、更新的Statement X{`1:c'x
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); q~j)W$k
该Statement取得的ResultSet就是可滚动的 UoHd -
2、创建PreparedStatement时指定参数 [z2eCH
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); j|mv+O
ResultSet.absolute(9000); cW; H!:&
批量更新 1 =^
1、Statement Dm^l?Z
Statement sm = cn.createStatement(); @7%.7LK
sm.addBatch(sql1); @`S.@^%7fO
sm.addBatch(sql2); <<sE`>)
... Q(e{~
]*
sm.executeBatch() Kr]z]4.d@
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ioWo ]
2、PreparedStatement JCD?qeTg
PreparedStatement ps = cn.preparedStatement(sql); #3+~.,X9
{ SB/3jH
ps.setXXX(1,xxx); W+\?~L.
... @D]lgq[
ps.addBatch(); z&F5mp@
} *{|$FQnR>(
ps.executeBatch(); '60//"9>k/
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 A?r^V2+j
eF5;[v
事务的处理 G,|KL" H6
1、关闭Connection的自动提交 -?z\5z
cn.setAutoCommit(false); #q;z8 @
2、执行一系列sql语句 N571s
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 6@YH#{~Zpv
Statement sm ; c0ZaFJ
sm = cn.createStatement(insert into user...); +>}o;`hPe
sm.executeUpdate(); (;ADW+.`J
sm.close(); d@ (vg
sm = cn.createStatement("insert into corp...); jkt6/H
sm.executeUpdate(); TF2KZL#A|
sm.close(); ^V.'^=l
3、提交 Y{+3}drJE
cn.commit(); :j,}{)5=
4、如果发生异常,那么回滚 T?rH
,$:
cn.rollback();