java 数据库基本操作 GS*O{u
1、java数据库操作基本流程 +s}!+I8P
2、几个常用的重要技巧: iBWzxPv:z
可滚动、更新的记录集 LBio$67F
批量更新 ~vP_c(8f
事务处理 J^t0M\
`+=Zq :0
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 C,,T7(: k
1、取得数据库连接 ^uX"04>;
1)用DriverManager取数据库连接 +4J'> dr
例子 X6sZwb
String className,url,uid,pwd; -0uGzd+m*
className = "oracle.jdbc.driver.OracleDriver"; A?tCa*b^
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 6rS
? FG=
uid = "system"; i<&z'A6&]*
pwd = "manager"; =$}`B{(H
Class.forName(className); H!NGY]z*
Connection cn = DriverManager.getConnection(url,uid,pwd); T7YJC,^m
2)用jndi(java的命名和目录服务)方式 :Gz$(!j1.'
例子 h-.^*=]R6
String jndi = "jdbc/db"; uA`e
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); vkLt#yj~
DataSource ds = (DataSource) ctx.lookup(jndi); W)`>'X`
Connection cn = ds.getConnection(); EQnU:a
多用于jsp中 Ym%#"
2、执行sql语句 6n:X
p_yO
1)用Statement来执行sql语句 ~m R^j
String sql; uP7|#>1%
Statement sm = cn.createStatement(); 2C0j.Ib
sm.executeQuery(sql); // 执行数据查询语句(select) 2SC'Z>A
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); p;[.&oJ
2)用PreparedStatement来执行sql语句 Y&VypZ"G>
String sql; uUl ;}W
sql = "insert into user (id,name) values (?,?)"; C&q}&=3r
PreparedStatement ps = cn.prepareStatement(sql); R||$Wi[$
ps.setInt(1,xxx); [L7S`Z
ps.setString(2,xxx); Ev#,}l+
... W9Us I
ResultSet rs = ps.executeQuery(); // 查询 XW'7
int c = ps.executeUpdate(); // 更新 0o6r3xc;
5Bcmz'?!
3、处理执行结果 >yyu:dk-;
查询语句,返回记录集ResultSet &xj40IZ
更新语句,返回数字,表示该更新影响的记录数 4YOLy\"S
ResultSet的方法 X"8$,\wX,
1、next(),将游标往后移动一行,如果成功返回true;否则返回false <q MX,h2
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 NVVAh5R
3F6'3NvVc2
4、释放连接 F0m[ls$
cn.close(); Vg(p_k45`
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection |rpMwkR
_ru<1n[4~
可滚动、更新的记录集 YU87l
1、创建可滚动、更新的Statement .>`7d=KT
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); EZ Q!~
该Statement取得的ResultSet就是可滚动的 oW7;t
2、创建PreparedStatement时指定参数 5W{|?l{
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); T~>&m~} +
ResultSet.absolute(9000); U:/_T>f%
批量更新 {YzpYc1
1、Statement J(~xU0gd'
Statement sm = cn.createStatement(); ^[HX#JJ~
sm.addBatch(sql1); TDtHRhq7
sm.addBatch(sql2); EY1L5Ba.
... Rlr[uU_
sm.executeBatch() Yk4ah$}%-^
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 xoSBMf
2、PreparedStatement ,!~U5~
PreparedStatement ps = cn.preparedStatement(sql); 4[0.M
{ )sEAPIka
ps.setXXX(1,xxx); 8W.-Y|[5?
... z ISy\uka
ps.addBatch(); jaTCRn3|<
} 7")&njQ/x
ps.executeBatch(); ^-}3+YA
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 H]lD*3b
a
8jG')zg
事务的处理 7
dG_E]&
1、关闭Connection的自动提交 F,5}3$
cn.setAutoCommit(false); yErvgf
2、执行一系列sql语句 _i"[m(ABj1
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close KbRKPA`
Statement sm ; :)e/(I]
sm = cn.createStatement(insert into user...); Yh%
sm.executeUpdate(); @iz6)2z
sm.close(); Io;26F""
sm = cn.createStatement("insert into corp...); `tsqnw
sm.executeUpdate(); i];@ e]
sm.close(); X<"#=u(
3、提交 g.EKdvY"%H
cn.commit();
1 pzd
4、如果发生异常,那么回滚 qr/N ?,
cn.rollback();