java 数据库基本操作 f( ]R/'o
1、java数据库操作基本流程 ,wEM
Jh
2、几个常用的重要技巧: %I_&Ehu
可滚动、更新的记录集 1po"gVot
批量更新 "fRlEO[9
事务处理 ^CfM|L8>
TP~(
r
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 *C5:#A0
1、取得数据库连接 T}V7SD.
1)用DriverManager取数据库连接 U&,r4>V@h>
例子 6
M*b 6
String className,url,uid,pwd; >sn"
className = "oracle.jdbc.driver.OracleDriver"; ?68$3;
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; wDB)&b
uid = "system"; /z/hUa
pwd = "manager"; *Hxj_
Class.forName(className); \nC5 ,Rz
Connection cn = DriverManager.getConnection(url,uid,pwd); 4\&H?:c.
2)用jndi(java的命名和目录服务)方式 ?UxG/]",
例子 >BJ2v=RA
String jndi = "jdbc/db"; 3?.6K0L
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); }Vs~RJM)}
DataSource ds = (DataSource) ctx.lookup(jndi); \k|_&hG
Connection cn = ds.getConnection(); xR0~S
3caI
多用于jsp中 _2]e1_=
2、执行sql语句 F<h&3
1)用Statement来执行sql语句 $eK8GMxZ#
String sql; 6].yRNy"
Statement sm = cn.createStatement(); <+<)xwOQ ]
sm.executeQuery(sql); // 执行数据查询语句(select) lO551Y^
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); UVc>i9,0
2)用PreparedStatement来执行sql语句 PZKbnu
String sql; [Xs}FJ
sql = "insert into user (id,name) values (?,?)"; WH{cJ7wCL
PreparedStatement ps = cn.prepareStatement(sql); \#uqD\DE
ps.setInt(1,xxx); +A'}PXm*tu
ps.setString(2,xxx); v>JB
rIb$
... !}iLO0
ResultSet rs = ps.executeQuery(); // 查询 ;X+G6F'
int c = ps.executeUpdate(); // 更新 <FXQxM5"
HT{F$27W
3、处理执行结果 6>@(/mh*
查询语句,返回记录集ResultSet }9MW!Ss
更新语句,返回数字,表示该更新影响的记录数 Z|]l"W*w
ResultSet的方法 UeMnc 5y
1、next(),将游标往后移动一行,如果成功返回true;否则返回false #rh0r`
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 '}wG"0
(jp1; #P!
4、释放连接 xnl<<}4pJ
cn.close(); {;]uL`abi?
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection hp?ad
&i4
(s%z#
可滚动、更新的记录集 B$K7L'e+-
1、创建可滚动、更新的Statement N5:D8oWWXR
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); nvU+XCx
该Statement取得的ResultSet就是可滚动的 /uy&2l
2、创建PreparedStatement时指定参数 @#bBs9@gv
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); [37f#p
ResultSet.absolute(9000); wk-Mu\
批量更新 N2[, aU
1、Statement {Uik|
Statement sm = cn.createStatement(); Gh>"s #+
sm.addBatch(sql1); ,$hQ(yF
sm.addBatch(sql2); SlH7-"Ag
... ,2=UuW"K
sm.executeBatch() bl(BA}<
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 @"q~AY
2、PreparedStatement $ka1X&f
PreparedStatement ps = cn.preparedStatement(sql); +W V@o'
{ 5A0KV7N5
ps.setXXX(1,xxx); nG&w0de<>
... -=-x>(pRW7
ps.addBatch(); Jm{As*W>
} R*JOiVAC
ps.executeBatch(); S#dyRTmI
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 rnzsfr-|(2
,gAr|x7_
事务的处理 ?TL2'U|M
1、关闭Connection的自动提交 "cnG/{($*
cn.setAutoCommit(false); NTpz)R
2、执行一系列sql语句 #J%h!#3g
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close v:'P"uU;4
Statement sm ; X}65\6
sm = cn.createStatement(insert into user...); #Z2>TN
sm.executeUpdate(); DI$mD{
sm.close(); [8V(N2
sm = cn.createStatement("insert into corp...); TE*> a5C|
sm.executeUpdate(); #Pe\Z/
sm.close(); kphy7>Km
3、提交 zJB+C=]D7H
cn.commit(); Z'*G'/*
4、如果发生异常,那么回滚 M]8eW
cn.rollback();