java 数据库基本操作 imZi7o
1、java数据库操作基本流程 ltO:./6v
2、几个常用的重要技巧: c'vxT<8fWW
可滚动、更新的记录集 *rXESw]BR
批量更新 Wr a W
事务处理 \=kH7 !
gG>1
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 m$NBG w
1、取得数据库连接 F@& R"-
1)用DriverManager取数据库连接 4h@jJm
例子 68[3
/
String className,url,uid,pwd; SsIy ;l
className = "oracle.jdbc.driver.OracleDriver"; rh5R kiF~
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 9gZMfP
uid = "system"; N /p9Ws
pwd = "manager"; *!$4
Class.forName(className); rr>QG<i;G
Connection cn = DriverManager.getConnection(url,uid,pwd); &na#ES$X,
2)用jndi(java的命名和目录服务)方式 w4Qqo(
例子 ,^pM]+NF|
String jndi = "jdbc/db"; *`mPPts}
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 1XSA3;ZEc
DataSource ds = (DataSource) ctx.lookup(jndi); #g#vDR!
Connection cn = ds.getConnection(); W2D^%;mw
多用于jsp中 x1:+M]Da
2、执行sql语句 HgvgO\`]
1)用Statement来执行sql语句 cv=nGFx6
String sql; KkP}z
Statement sm = cn.createStatement(); Dd-;;Y1C
sm.executeQuery(sql); // 执行数据查询语句(select) HJhPd#xCW
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); peCmb)>Sa
2)用PreparedStatement来执行sql语句 / *RDy!m
String sql; an_qE}P
sql = "insert into user (id,name) values (?,?)"; }zY)H9J~
PreparedStatement ps = cn.prepareStatement(sql); rbiNp6AdL
ps.setInt(1,xxx); !rZO~a0
ps.setString(2,xxx); g]EDL<b
... guz{DBlK
ResultSet rs = ps.executeQuery(); // 查询 h!5^d!2,
int c = ps.executeUpdate(); // 更新 gh=s#DQsFw
gcqcY
3、处理执行结果 J]UlCg
查询语句,返回记录集ResultSet r5jiB L~
更新语句,返回数字,表示该更新影响的记录数 '(mJ*Eb
ResultSet的方法 2.ud P
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 9!b,!#=
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 f{xR
s-u]
)8kcOBG^L
4、释放连接 nF~</>
cn.close(); C7[ge&
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection z~Ph=1O>p
D
M(WYL{
可滚动、更新的记录集 8ar2N)59
1、创建可滚动、更新的Statement Genk YtS
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 1@q~(1-o
该Statement取得的ResultSet就是可滚动的 xT70Rp(2po
2、创建PreparedStatement时指定参数 S8*VjG?T\
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); E/|]xKG
ResultSet.absolute(9000); CB<1]Z
批量更新 R#i|n<x
1、Statement k@JDG]R<{
Statement sm = cn.createStatement(); 4r;!b;3
sm.addBatch(sql1); ^wPKqu)^
sm.addBatch(sql2); #gq4%;
... #mlTN3
sm.executeBatch() j2# nCU54Z
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 +5H9mk
2、PreparedStatement \?c0XD
PreparedStatement ps = cn.preparedStatement(sql); "'h?O*V]u{
{ La48M'u
ps.setXXX(1,xxx); =A={Dpv[>
... 6NH.!}"G9
ps.addBatch(); `<kHNcm
} })!d4EcZf
ps.executeBatch(); 9 P_`IsVK
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ?Y+xuY/t
biG=4?Xl
事务的处理 \bYuAE1q
1、关闭Connection的自动提交 0Ge*\Q
cn.setAutoCommit(false); h^^zR)EVb
2、执行一系列sql语句 .NcoST9a
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close >C y
Statement sm ; Cbm
sm = cn.createStatement(insert into user...); qH!}oPeU'
sm.executeUpdate(); ZOc1 vj
sm.close(); `l@[8H%aw
sm = cn.createStatement("insert into corp...); }[}u5T`w>
sm.executeUpdate(); NLFs)6\
sm.close(); i)f3\?,,
3、提交 s
(|T@g
cn.commit(); F>jPr8&
4、如果发生异常,那么回滚 Be}e%Rk
cn.rollback();