java 数据库基本操作 /P!X4~sTM
1、java数据库操作基本流程 1gShV ]2
2、几个常用的重要技巧: i %hn
可滚动、更新的记录集 t+!gzZ
批量更新 <]Pix)
事务处理 ?PE1aB+{:
#4_O;]{'
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 EkStb#
1、取得数据库连接 9hR:y.
1)用DriverManager取数据库连接 *K jVPs
例子 [> &+*c
String className,url,uid,pwd; !
jX+ox
className = "oracle.jdbc.driver.OracleDriver"; L2>?m`wp
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; W|H4i;u
uid = "system"; ;8L+_YCa
pwd = "manager"; I6hhU;)C
Class.forName(className); _N,KHxsG8B
Connection cn = DriverManager.getConnection(url,uid,pwd); <S8I"8{Mb
2)用jndi(java的命名和目录服务)方式 ~e`;"n@4
例子 oX2DFgz
String jndi = "jdbc/db"; [Yx-l;78
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); X[~f:E[1J
DataSource ds = (DataSource) ctx.lookup(jndi); 7o965h
Connection cn = ds.getConnection(); |P. =
多用于jsp中 n$hqNsM
2、执行sql语句 1RI #kti-"
1)用Statement来执行sql语句 /md Q(Dm
String sql; 9Nag%o{*S>
Statement sm = cn.createStatement(); n^JUZ8
sm.executeQuery(sql); // 执行数据查询语句(select) Pzk[^z$C
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); igRDt{}
2)用PreparedStatement来执行sql语句 ^i`3cCFB<
String sql; E2q B:
sql = "insert into user (id,name) values (?,?)"; z6FbM^;;
PreparedStatement ps = cn.prepareStatement(sql); {m+S{dWp
ps.setInt(1,xxx); "]SJbuzh
ps.setString(2,xxx); gQI(=in
... )WP]{ W)r
ResultSet rs = ps.executeQuery(); // 查询 >uyeI&z
int c = ps.executeUpdate(); // 更新 L_
Xn,
]xJ'oBhy
3、处理执行结果 ^Kw&=u
查询语句,返回记录集ResultSet a8bX"#OR&N
更新语句,返回数字,表示该更新影响的记录数 u,Q_WR-wJ
ResultSet的方法 2\nBqCxR
1、next(),将游标往后移动一行,如果成功返回true;否则返回false (:&&;]sI
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 X|-v0 f
(5Z8zNH`3
4、释放连接 \]f5
cn.close(); mJGO)u&
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection >%n8W>^^4
-~(0O
可滚动、更新的记录集 qXP1Q3
1、创建可滚动、更新的Statement 7E!";HT
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); M]6w^\4j9
该Statement取得的ResultSet就是可滚动的 c]%;^)
2、创建PreparedStatement时指定参数 @o4z3Q@
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); zH=/.31Q
ResultSet.absolute(9000); -+
]T77r
批量更新 =A0"0D{\
1、Statement @sB}q 6>
Statement sm = cn.createStatement(); Qb6QXjN
Q
sm.addBatch(sql1); ?;:9
W
sm.addBatch(sql2);
8(vC jL
... .*RB~c
t
sm.executeBatch() 'uP'P#
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 (opROsFh
2、PreparedStatement .KiPNTh'
PreparedStatement ps = cn.preparedStatement(sql); B%%.@[o,
{ <?>I\
ps.setXXX(1,xxx); ny!lja5[
... SQdzEF
ps.addBatch(); z`86-Ov
} B&%L`v2[
ps.executeBatch(); f"ZqA'KB#
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 zx\.2<K
;uM34^
事务的处理 ,-cpsN
1、关闭Connection的自动提交 u=d`j
cn.setAutoCommit(false); v5&xY2RI7
2、执行一系列sql语句 lgCHGv2@
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Vr&el
Statement sm ; "fX_gN?
sm = cn.createStatement(insert into user...); ;_?zB NW
sm.executeUpdate(); x"(7t3xK
sm.close(); WX%h4)z*
sm = cn.createStatement("insert into corp...); mC*W2#1pF
sm.executeUpdate(); S F&M
(=w<
sm.close(); p<of<YU)
3、提交 ]Wy^VcqX
cn.commit(); [ -9)T
4、如果发生异常,那么回滚 =R8f)UQYx
cn.rollback();