java 数据库基本操作 mTt 9 o9E
1、java数据库操作基本流程 "T'!cy
2、几个常用的重要技巧: K{c^.&6D
可滚动、更新的记录集 XpGom;z^c
批量更新 [O3R(`<e5
事务处理 F^f]*MhT"
(0S"ZT
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 n\ZFPXP
1、取得数据库连接 &xVWN>bd^
1)用DriverManager取数据库连接 Q'N<jX[
例子 0-FbV,:;
String className,url,uid,pwd; +RM3EvglDQ
className = "oracle.jdbc.driver.OracleDriver"; cGDA0#r
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; (8{Z@
uid = "system"; (]JJ?aAF
pwd = "manager"; %+.]>''a
Class.forName(className); S'WmPv
Connection cn = DriverManager.getConnection(url,uid,pwd); _MR2,mC
2)用jndi(java的命名和目录服务)方式 >2rFURcD
例子 {>:2Ff]O:
String jndi = "jdbc/db"; cIX59y#7
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); :p{iBDA
DataSource ds = (DataSource) ctx.lookup(jndi); f,$CiZ"
Connection cn = ds.getConnection(); `4o;Lz~
多用于jsp中 &45.*l|mo
2、执行sql语句 9H<:\-:
1)用Statement来执行sql语句 o8" [6Ys
String sql; c}Qc2D3*
Statement sm = cn.createStatement(); Zqao4
sm.executeQuery(sql); // 执行数据查询语句(select) ecb[m2z
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ,W#y7t
2)用PreparedStatement来执行sql语句 /xmd]XM=_
String sql; dZm{?\^_
sql = "insert into user (id,name) values (?,?)"; a8N!jQc_m
PreparedStatement ps = cn.prepareStatement(sql); 1ayxE(vMcX
ps.setInt(1,xxx); mHP1.Z`
ps.setString(2,xxx); jq[>PvR
... pyN PdEy
ResultSet rs = ps.executeQuery(); // 查询 ?vhW`LXNB
int c = ps.executeUpdate(); // 更新 rScmUt
au8)G_A
3、处理执行结果 2XE4w# [j
查询语句,返回记录集ResultSet r"n)I$
更新语句,返回数字,表示该更新影响的记录数 h'bxgIl'`
ResultSet的方法 @/9>
/?JP
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 8E" .y$AW
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 a; "+Py
27MgwX
NQ
4、释放连接 %VdJ<=@
cn.close(); d+bTRnL
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ZK;HW
XhS<GF%
可滚动、更新的记录集 OTRTa{TB
1、创建可滚动、更新的Statement 8z+ CYeV
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); +"C0de |-
该Statement取得的ResultSet就是可滚动的 t+&WsCN
2、创建PreparedStatement时指定参数 !:>y.^O
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); +n0y/0Au
ResultSet.absolute(9000); SZgH0W("L
批量更新 |h3YL!
1、Statement ^Ab|\5^3
Statement sm = cn.createStatement(); 6Us#4 v,
sm.addBatch(sql1); 7~IAgjo,@
sm.addBatch(sql2); Kp"o0fh<9
... 2sXWeiJy;
sm.executeBatch() ON$u581 y
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 2nwP-i
2、PreparedStatement fQv^=DI#
PreparedStatement ps = cn.preparedStatement(sql); ?&Lb6(}e
{ b&!X#3(KT
ps.setXXX(1,xxx); <AB]FBo(
... Kj'uTEM
ps.addBatch(); N~a?0x
} +VTMa9d
ps.executeBatch(); 6@bO3K|
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 wc ^z9y
FzNs >*
事务的处理 M*t{?o/t;
1、关闭Connection的自动提交 c(@)V.o2
cn.setAutoCommit(false); s:Memvf
2、执行一系列sql语句 r;9F@/
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close &