java 数据库基本操作 t#y,9>6
1、java数据库操作基本流程 l`:u5\ rM
2、几个常用的重要技巧: rbIYLVA+V
可滚动、更新的记录集 afD {w*[8
批量更新 p>3QW3<
事务处理 a;-%C{S9r
I\c7V~^hnG
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ONy\/lu|
1、取得数据库连接 E.ji;5
1)用DriverManager取数据库连接 W ;+()vC
例子 Y}t)!}p$r
String className,url,uid,pwd; XD0a :T)
className = "oracle.jdbc.driver.OracleDriver"; GXQ%lQ
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; }YM\IPsPu
uid = "system"; e<a*@
P,
pwd = "manager"; :&:P4Y1
E
Class.forName(className);
-%%Xx5D
Connection cn = DriverManager.getConnection(url,uid,pwd); Sj|tR[SAoD
2)用jndi(java的命名和目录服务)方式 EEK!'[<,sE
例子 pYr+n9)^
String jndi = "jdbc/db"; zks7wt]A
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); LYd:S
DataSource ds = (DataSource) ctx.lookup(jndi); oqhJ2
Connection cn = ds.getConnection(); xJU]py~o
多用于jsp中 Q^3{L\6_
2、执行sql语句 S&XlMu
1)用Statement来执行sql语句 6\I1J=
C
String sql; %xQ'i4`
Statement sm = cn.createStatement(); enQW;N1_M
sm.executeQuery(sql); // 执行数据查询语句(select) U/cj_}uX
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); jV%=YapF
2)用PreparedStatement来执行sql语句 )S`[ gK
String sql; f>4|>kS
sql = "insert into user (id,name) values (?,?)"; Kn= EDtg
PreparedStatement ps = cn.prepareStatement(sql); .j^BWr
ps.setInt(1,xxx); PUZcb+%]h
ps.setString(2,xxx); .oT'(6#
... nTwJR
ResultSet rs = ps.executeQuery(); // 查询 8Lx1XbwK
int c = ps.executeUpdate(); // 更新 "$o>_+U
g)TZ/,NQ{
3、处理执行结果 CxJ3u
查询语句,返回记录集ResultSet w{k ^O7~
更新语句,返回数字,表示该更新影响的记录数 JsuI&v
ResultSet的方法 +Ss3Ph
1、next(),将游标往后移动一行,如果成功返回true;否则返回false zF>;7'\x
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Umz b
>$-YNZA
4、释放连接 6aHD?a o
cn.close(); +/RR!vG,
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection tK/,U
=+
/je
$+
可滚动、更新的记录集 Rf>)#hn%
1、创建可滚动、更新的Statement ^ +@OiL>&i
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); kN{$-v=K
该Statement取得的ResultSet就是可滚动的 ISK 8t
2、创建PreparedStatement时指定参数 A?}[rM
Z
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); P:vp/x!
ResultSet.absolute(9000); `aG_ m/7|
批量更新 U$+,|\9
1、Statement ;s3\Z^h4kd
Statement sm = cn.createStatement(); eiyr^Sch.
sm.addBatch(sql1); GI,TE
sm.addBatch(sql2); WG\
_eRj
... oA7DhU5n
sm.executeBatch() 2@
9? ~?r
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 G/(,,T}eG
2、PreparedStatement <DR!AR)
PreparedStatement ps = cn.preparedStatement(sql); _Y]Oloo('
{ Cojs;`3iF:
ps.setXXX(1,xxx); t^zE^:06
... :3
Hz!iZM
ps.addBatch(); 2PRiiL@
} >JsVIfAF
ps.executeBatch(); Z}\,rex
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 6S_mfWsi
3c,4 wyn
事务的处理 Q3&DA1b`
1、关闭Connection的自动提交 #Y=b7|l
cn.setAutoCommit(false); U!uJ )mm
2、执行一系列sql语句 E0fMFG^P
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ~|O; Sdo=
Statement sm ; )`'a1y|
sm = cn.createStatement(insert into user...); _,aFQ^]'9
sm.executeUpdate();
)R'%SLw
sm.close(); QKts-b[3
sm = cn.createStatement("insert into corp...); 4u%AZ<-C}m
sm.executeUpdate(); +75"Q:I
sm.close(); .[1 f$
3、提交 D&uaA-;s
cn.commit(); &S66M2
4、如果发生异常,那么回滚 aQ\SV0PI
cn.rollback();