java 数据库基本操作 pE4a ~:
1、java数据库操作基本流程 #&&T1;z"#
2、几个常用的重要技巧: _>;Wz7
可滚动、更新的记录集 !Lf<hS^
批量更新 V)`2Kw
事务处理 IY`p7 )#i
=?fz-HB
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 N4!`iS Y
1、取得数据库连接 &v{Ehkr*
1)用DriverManager取数据库连接 zH8E,)
例子 7~/ cz_
String className,url,uid,pwd; %z><)7
className = "oracle.jdbc.driver.OracleDriver"; I &t~o
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Eah6"j!B8n
uid = "system"; OU[<\d
pwd = "manager"; *U?O4E9
Class.forName(className); wHc
my
Connection cn = DriverManager.getConnection(url,uid,pwd); HGDrH
2)用jndi(java的命名和目录服务)方式 gb ga"WO
例子 200yN+ ec
String jndi = "jdbc/db"; o\IMYT
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); uepyH
DataSource ds = (DataSource) ctx.lookup(jndi); qLN^9PdEE
Connection cn = ds.getConnection(); ,5}U
H
多用于jsp中 B`5<sW
2、执行sql语句 }SN( ^3N
1)用Statement来执行sql语句 sHP-@
String sql; J!6FlcsZm
Statement sm = cn.createStatement(); RLB3 -=9t
sm.executeQuery(sql); // 执行数据查询语句(select) 3$$E0`7.
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); -4a9 BE".
2)用PreparedStatement来执行sql语句 #WpkL]g2+%
String sql; z ^gJy,T
sql = "insert into user (id,name) values (?,?)"; K}VCFV
PreparedStatement ps = cn.prepareStatement(sql);
157_0
ps.setInt(1,xxx); \N>-+r
ps.setString(2,xxx); wl
Oeoi
... (q>
TKM
ResultSet rs = ps.executeQuery(); // 查询 /0h
*(nL
int c = ps.executeUpdate(); // 更新 `@]s[1?f
K2x[ApS#
3、处理执行结果 Zp_(vOc
查询语句,返回记录集ResultSet d2
^}ooE
更新语句,返回数字,表示该更新影响的记录数 3^ Yc%
ResultSet的方法 Y?VbgOM)
1、next(),将游标往后移动一行,如果成功返回true;否则返回false {f!/:bM
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ie}OZM
5,RUPaE
4、释放连接 T(4d5 fY
cn.close(); @fL ^I&++
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection (!os&/",
/HC:H,"i
可滚动、更新的记录集 [m
t.2 .
1、创建可滚动、更新的Statement f^WTsh]
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY);
--$o$EP`
该Statement取得的ResultSet就是可滚动的 1^p/#jt
2、创建PreparedStatement时指定参数 iTVe8eI
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); h~MV=7
lE
ResultSet.absolute(9000); Y Y:BwW:
批量更新 f&
4_:'-,
1、Statement JE?p'77C
Statement sm = cn.createStatement(); V|7YRa@
sm.addBatch(sql1); j]a$RC#
sm.addBatch(sql2); vh9* >[i
... =P-&dN
sm.executeBatch() )*|/5wW1
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 P:qmg"i@3
2、PreparedStatement !*IMWm>
PreparedStatement ps = cn.preparedStatement(sql); T5BZD
+Ta
{ G7-BeA8
ps.setXXX(1,xxx); I$Nh|eM
... l.[pnL D
ps.addBatch();
CI|lJ
} +Q*`kg'
ps.executeBatch(); !,WGd|oJ
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 TBhM^\z
30Yis_l2h
事务的处理 bdUPo+
1、关闭Connection的自动提交 "}]`64?
cn.setAutoCommit(false); )^h6'h`
2、执行一系列sql语句 cH]tZ$E`
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close dn6B43w
Statement sm ; ntiS7g e1
sm = cn.createStatement(insert into user...); W+XWS,(
sm.executeUpdate(); xS18t="
sm.close(); 3:%k
pnO
sm = cn.createStatement("insert into corp...); j jpYg
sm.executeUpdate(); *OVB;]D3+
sm.close(); '[F:uA
3、提交 +)Te)^&v%
cn.commit(); Z5{a7U4z_
4、如果发生异常,那么回滚 :NzJvI<
cn.rollback();