java 数据库基本操作 ^-P lTmT
1、java数据库操作基本流程 @DfjeS)u^
2、几个常用的重要技巧: O9oVx4=
可滚动、更新的记录集 83:m7;
批量更新 }Gr5TDiV0\
事务处理 Ua\g*Cxh
2pH2s\r<UJ
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 3Z NYR'
1、取得数据库连接 <6U{I '
1)用DriverManager取数据库连接 $@+\_f'bU>
例子 7*d}6\
%
String className,url,uid,pwd; 4VSIE"8e
className = "oracle.jdbc.driver.OracleDriver"; %Vrl"4^}t
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; lh3%2Dq$
uid = "system"; s#?Y^bgH
pwd = "manager"; #Qc[W +%
Class.forName(className); &G5+bUF,
Connection cn = DriverManager.getConnection(url,uid,pwd); )7c\wAs
2)用jndi(java的命名和目录服务)方式 Q<P],}?:
例子 8vz9o <I
String jndi = "jdbc/db"; ~d?7\:n
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); "m0>u,HmI
DataSource ds = (DataSource) ctx.lookup(jndi); S*?'y
Connection cn = ds.getConnection(); `,tv&siSA
多用于jsp中 R*/%+
2、执行sql语句 #JeZA0r5
1)用Statement来执行sql语句 oHB51< }
String sql; `;*%5WD%
Statement sm = cn.createStatement(); SoS[yr
sm.executeQuery(sql); // 执行数据查询语句(select) %#2[3N{
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); J:)Q)MT24:
2)用PreparedStatement来执行sql语句 x "]%q^x
String sql; 6cVaO@/(
sql = "insert into user (id,name) values (?,?)"; fyYT #r
PreparedStatement ps = cn.prepareStatement(sql); c^}gJ
ps.setInt(1,xxx); cG6Q$
ps.setString(2,xxx); h"Yi'
... 5W>i'6*
ResultSet rs = ps.executeQuery(); // 查询 ypwVzCUG
int c = ps.executeUpdate(); // 更新 A5z`_b4f
K=M5d^K<E
3、处理执行结果 NtkEb :
查询语句,返回记录集ResultSet 5R?iTB1,
更新语句,返回数字,表示该更新影响的记录数 G<9MbMG
ResultSet的方法 FgrOZI;_
1、next(),将游标往后移动一行,如果成功返回true;否则返回false #?YQ&o~gZ
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 9yajtR
DoX#+
07u4
4、释放连接 i>_V?OT#5
cn.close(); +*a:\b"fx
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection x&+/da-E/5
~0>g 4
D.
可滚动、更新的记录集 O1Ey{2Q
1、创建可滚动、更新的Statement C^K?"800
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); F'*y2FC
该Statement取得的ResultSet就是可滚动的 Tf
Q(f?
2、创建PreparedStatement时指定参数 25t2tj@S
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); sKB])mf]
ResultSet.absolute(9000); |L.QIr,jCC
批量更新 `Q<hL {AH
1、Statement C]K@SN$
Statement sm = cn.createStatement(); 2TmQaDu%b
sm.addBatch(sql1); )}9Ef"v|
sm.addBatch(sql2); ^,
q\S
... L9Z:>i?
sm.executeBatch() L qMH]W
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 %L:e~*
2、PreparedStatement LtJ$ZE^GB
PreparedStatement ps = cn.preparedStatement(sql); `]_#_
{ VT?JTW
ps.setXXX(1,xxx); tmDI2Z%7
... ]L^X}[SH
ps.addBatch(); l131^48U
} ~ULuX"n
ps.executeBatch(); =<y$5"|
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 mNc(
rg"W1m[k
事务的处理 ",(-AU!a)h
1、关闭Connection的自动提交 QB'-`GwL
cn.setAutoCommit(false); :-xp'_\L
2、执行一系列sql语句 hdQ[=PH)
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close dMCV
!$
Statement sm ; 5Z]`n
sm = cn.createStatement(insert into user...); d2'9C6t
sm.executeUpdate(); ~#h@.yW^JN
sm.close(); 8h=H\v^f
sm = cn.createStatement("insert into corp...);
R,x\VX!|
sm.executeUpdate(); =7e~L 3 K
sm.close(); ={~`0,
3、提交 `S2YBKz,1
cn.commit(); m%m/#\J E
4、如果发生异常,那么回滚 _=3H!b =
cn.rollback();