java 数据库基本操作 YoRD9M~iG~
1、java数据库操作基本流程 7C^W <SUo
2、几个常用的重要技巧: j|(bdTZY:
可滚动、更新的记录集 G%fNGQwT
批量更新 T:EUI]
事务处理 Jd/XEs?<q
K;(t@GL?
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 JuXuS
1、取得数据库连接 dw< b}2
1)用DriverManager取数据库连接 uB3Yl=P
例子 @>hXh
+!2h
String className,url,uid,pwd; >U[YSsFt6
className = "oracle.jdbc.driver.OracleDriver"; je~gk6}Y
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; JztSP?
uid = "system"; T#R*]
pwd = "manager"; Vb8{OD3PK
Class.forName(className); 'tzN.p1O
Connection cn = DriverManager.getConnection(url,uid,pwd); Q!}LtR$
2)用jndi(java的命名和目录服务)方式 hk+"c^g:j<
例子 si>gYO
String jndi = "jdbc/db"; {DGnh1
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); *[wj )
DataSource ds = (DataSource) ctx.lookup(jndi); L@LT *M
Connection cn = ds.getConnection(); 83YQ c
多用于jsp中 U~[ tp1Z)
2、执行sql语句 wE09%
1)用Statement来执行sql语句 zRF+D+
String sql; $8Y|&P
Statement sm = cn.createStatement(); wg 6
sm.executeQuery(sql); // 执行数据查询语句(select) _,]@xFCOH
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 3!KEk?I]
2)用PreparedStatement来执行sql语句 }Fgp*x-G
String sql; &$E.rgtg
sql = "insert into user (id,name) values (?,?)"; )u(Dq u\t
PreparedStatement ps = cn.prepareStatement(sql); bmGtYv
ps.setInt(1,xxx); GxcW^{;
ps.setString(2,xxx); 5_Opx=
... ALnE[}N6,
ResultSet rs = ps.executeQuery(); // 查询 5Lm<3:7Q+
int c = ps.executeUpdate(); // 更新 3r,^is
@
Yzj
3、处理执行结果 91j.%#[v'
查询语句,返回记录集ResultSet t_ZWd#x+;
更新语句,返回数字,表示该更新影响的记录数 RkXW(T`
ResultSet的方法 Z?tw#n[T
1、next(),将游标往后移动一行,如果成功返回true;否则返回false F6 c1YI[
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 8&KqrA86
8n)3'ok
4、释放连接 Nc[V kJ]
cn.close(); ` z!?!"=
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection _i+7O^=d6X
qx\P(dOUf
可滚动、更新的记录集 ;tu2}1#r
1、创建可滚动、更新的Statement ?>o|H-R~5Z
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); +c_8~C
该Statement取得的ResultSet就是可滚动的 [}bPkD
2、创建PreparedStatement时指定参数 / :@X<
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Luu.p<
ResultSet.absolute(9000); #sp8 !8|y
批量更新 2XGbqZj
1、Statement i5^U1K\M
Statement sm = cn.createStatement(); W8{zV_TBm
sm.addBatch(sql1); |F^h>^
x
sm.addBatch(sql2); _a~-B@2g
... >^hy@m
sm.executeBatch() S k&l8"
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 b!xm=U
2、PreparedStatement ^5d9n<_xnQ
PreparedStatement ps = cn.preparedStatement(sql); 1*J#:|({(
{ `di/nv)
ps.setXXX(1,xxx); BY^5z<^.
... O/2Jz
ps.addBatch(); i7(\i2_P
} vAp?Zl?g
ps.executeBatch(); uA2-&smw
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 f$^+;j
[?Ub =sp
事务的处理 j>t*k!db
1、关闭Connection的自动提交 -S %)2(f^
cn.setAutoCommit(false); esVZ2_eL
2、执行一系列sql语句 3teanU`
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close f.SmCgG
Statement sm ; =3?"s(9
sm = cn.createStatement(insert into user...); ]w[T_4l
sm.executeUpdate(); [e+$jsPl
sm.close(); Pb-Ft=
sm = cn.createStatement("insert into corp...); IB+)2 `
sm.executeUpdate(); C2 ] x
sm.close(); >E3 lY/[
3、提交 <<[hZ$.
cn.commit(); 'U'#_mYG
4、如果发生异常,那么回滚 wam-=3W
cn.rollback();