java 数据库基本操作 e/8z+H^H
1、java数据库操作基本流程 45@]:2j
2、几个常用的重要技巧: G2#d$
可滚动、更新的记录集 Y=*P
8pg
批量更新 QR>
Y%4 ;h
事务处理 D%7kBfCb
RkuuogZ
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 m7%C#+67
1、取得数据库连接 d"U(`E=H9
1)用DriverManager取数据库连接 #g5^SR|qE
例子 o\`>c:.
String className,url,uid,pwd; +zkm(
className = "oracle.jdbc.driver.OracleDriver"; gr-x|wK
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; y\F=ui
uid = "system"; Qpt&3_
pwd = "manager"; zTD@
Class.forName(className); <8#ObdY!
Connection cn = DriverManager.getConnection(url,uid,pwd); r,N[ )@
2)用jndi(java的命名和目录服务)方式 nW+YOX|+
例子 a45ss7
String jndi = "jdbc/db"; ^# A.@
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ~/IexQB&
DataSource ds = (DataSource) ctx.lookup(jndi); m~],nl
Connection cn = ds.getConnection(); ?G08[aNR
多用于jsp中 1j\aH&)GH
2、执行sql语句 t/Z:)4Z
1)用Statement来执行sql语句 p8+/\Ee]B
String sql; Dz_eB"}
Statement sm = cn.createStatement(); DP7C?}(
sm.executeQuery(sql); // 执行数据查询语句(select) 3P <'F2o
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 8@M'[jT
2)用PreparedStatement来执行sql语句 vtMJ@!MN;
String sql; 5M23/=
N
sql = "insert into user (id,name) values (?,?)"; g6sjc,`
PreparedStatement ps = cn.prepareStatement(sql); bQaoMZB
ps.setInt(1,xxx); P|^$kK
ps.setString(2,xxx); q9dLHi<1
... 4S
L_-Hm.
ResultSet rs = ps.executeQuery(); // 查询 }~o
ikN:
int c = ps.executeUpdate(); // 更新 z8Q"%@
]v5-~E!
3、处理执行结果 ACV ek
查询语句,返回记录集ResultSet ~]8p_;\
更新语句,返回数字,表示该更新影响的记录数 ^ft]b2i
ResultSet的方法 l[/q%Ca'>
1、next(),将游标往后移动一行,如果成功返回true;否则返回false fw{,bJ(U
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 .h;Se
>&H~nGP.
4、释放连接 t#<KxwhcN
cn.close(); hN(L@0)
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Z,WW]Y,$
3D)b*fPc
可滚动、更新的记录集 .dI)R40L/\
1、创建可滚动、更新的Statement g-yi xU
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); }.:d#]g8
该Statement取得的ResultSet就是可滚动的 }#= Od e
2、创建PreparedStatement时指定参数 [.q(h/b
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); vZajT!h
ResultSet.absolute(9000);
'H FK Bp
批量更新 j[P8
1、Statement aQcN&UA@
Statement sm = cn.createStatement(); ggou*;'
sm.addBatch(sql1); !%mi&ak(Rn
sm.addBatch(sql2); W>L@j(
... (BERY
sm.executeBatch() M^H90GN)X
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 x.EgTvA&d
2、PreparedStatement h)E|?b_
PreparedStatement ps = cn.preparedStatement(sql); eO{@@?/y
{ 67J*&5? |
ps.setXXX(1,xxx); w{'2q^>6*
... 2z983^
ps.addBatch(); '@:[axu
} {rPk3
ps.executeBatch(); d.pp3D9/
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Q
@2(aR
:HW>9nD.
事务的处理 WF/l7u#4i
1、关闭Connection的自动提交 kUHie
cn.setAutoCommit(false); y3yvZD
2、执行一系列sql语句 G[q9A$yw
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 0RyFv+
Statement sm ; yx0Q+Sm1:
sm = cn.createStatement(insert into user...); Ko}2%4on
sm.executeUpdate(); :pd&dg!5
sm.close(); B
<+K<,S
sm = cn.createStatement("insert into corp...); <lOaor
c
sm.executeUpdate(); (^H5EeGV{
sm.close(); cw+g
z!!
3、提交 w &vhWq
cn.commit(); m4gU*?
4、如果发生异常,那么回滚 {Bvm'lq`
cn.rollback();