java 数据库基本操作 SJw0y[IL6(
1、java数据库操作基本流程 2 !{P<
2、几个常用的重要技巧: 5o&L|7]
可滚动、更新的记录集 \@5W&Be^
批量更新 brZ3T`p+.P
事务处理 G.L4l|%W
Rb#?c+&#
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 gJ2R(YMF
1、取得数据库连接 1298&C@
1)用DriverManager取数据库连接 WpRi+NC}ln
例子 N+h|Ffnp
String className,url,uid,pwd; AX[/S8|6
className = "oracle.jdbc.driver.OracleDriver"; )-[X^l
j
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; \}Hk`n)Aq
uid = "system"; l@##
Ex9
pwd = "manager"; ""TRLs!:M
Class.forName(className); 3"%:S_[
Connection cn = DriverManager.getConnection(url,uid,pwd); ~KEnZa0
2)用jndi(java的命名和目录服务)方式 D4_D{\xhO
例子 obUh+9K
String jndi = "jdbc/db"; }K0.*+M
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); IgZX,4i=o
DataSource ds = (DataSource) ctx.lookup(jndi); .] 5&\
Connection cn = ds.getConnection(); ))u$j4V
多用于jsp中 L[rJ7:
2、执行sql语句 *j8w"
4
1)用Statement来执行sql语句 :'#BU:
String sql; ,1QU
Statement sm = cn.createStatement(); ;p1%KmK3
sm.executeQuery(sql); // 执行数据查询语句(select) ePB=aCZ
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ;v#~o*
2)用PreparedStatement来执行sql语句 lAV6z%MmM
String sql; !j [U
sql = "insert into user (id,name) values (?,?)"; (iH5F9WO
PreparedStatement ps = cn.prepareStatement(sql); 7?b'"X"
ps.setInt(1,xxx); 1,BtOzuRo
ps.setString(2,xxx); [K%Jt
... DS-Kot(k(z
ResultSet rs = ps.executeQuery(); // 查询 XW`&1qx
int c = ps.executeUpdate(); // 更新 hNSV}~h
*T*MLD]Q
3、处理执行结果 YgrBIul
查询语句,返回记录集ResultSet dLG5yx\js
更新语句,返回数字,表示该更新影响的记录数 (8k3z`
ResultSet的方法 c7'I'~
1、next(),将游标往后移动一行,如果成功返回true;否则返回false F6YMcdU
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 2A
{k>TjQ
:!J!l u
4、释放连接 ppfBfMX
cn.close(); 592q`m\
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ?ZE1>L7e
!Vv$
可滚动、更新的记录集 $ v$~.
1、创建可滚动、更新的Statement <wc=SMmO
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); _K8ob8)m
该Statement取得的ResultSet就是可滚动的 _D[vMr[
2、创建PreparedStatement时指定参数 \} P} H
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 5(tOQ%AQ
ResultSet.absolute(9000); |'b=xeH.^<
批量更新 I4gyGg$H
1、Statement 2y v'DS
Statement sm = cn.createStatement(); .pr- ^
sm.addBatch(sql1); -@<k)hWr
sm.addBatch(sql2); >/eQjp?:
... Ri"3o
sm.executeBatch() +Q8Bin
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 bxK1v7
2、PreparedStatement ^+Ec}+ Q
PreparedStatement ps = cn.preparedStatement(sql); 0ppZ~}&
{ {{SeD:hx
ps.setXXX(1,xxx); TCv}N0
... KPs5? X
ps.addBatch(); $@7S+'Q3
} 9^c\$"2B
ps.executeBatch(); q_ykB8Ensa
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 OtrO"K
xmT(yv,
事务的处理 /`Yp]l
1、关闭Connection的自动提交 1#&*xF"
cn.setAutoCommit(false); 2~K.m@U}!Z
2、执行一系列sql语句 ZBB^?FF
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close K#}DXq
Statement sm ; `/Zi=.rr
sm = cn.createStatement(insert into user...); ~ubGx
sm.executeUpdate(); x$cs_q]J
sm.close(); hmHm;l
sm = cn.createStatement("insert into corp...); Q+U}
sm.executeUpdate(); )K4 |-<i
sm.close(); 9axJ2J'g
3、提交 }`{aeVHT
cn.commit(); `u3to{
4、如果发生异常,那么回滚 YrS%Yvhj0
cn.rollback();