java 数据库基本操作 ;*+H&
1、java数据库操作基本流程 Hj1?c,mo4
2、几个常用的重要技巧: A|4
3W=
可滚动、更新的记录集 \R-'<kN.*
批量更新 JSylQ201
事务处理 {md5G$*%
MLiaCG;
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 hhWy-fP#
1、取得数据库连接 \QG2V$
1)用DriverManager取数据库连接 }G^'y8U
例子 m$hkmD|
String className,url,uid,pwd; wSM(!:on5
className = "oracle.jdbc.driver.OracleDriver"; ?I+$KjE+
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 6Hy_7\$(-
uid = "system"; L?M
x"
pwd = "manager"; e]dFNunFq0
Class.forName(className); Nw"?~"bo
Connection cn = DriverManager.getConnection(url,uid,pwd); ;;C2t&(
2)用jndi(java的命名和目录服务)方式 uvR l`"Y
例子 "&`>+Yw
String jndi = "jdbc/db"; m;1/+qs0
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 1`s^r+11:
DataSource ds = (DataSource) ctx.lookup(jndi); 6Z=Qs=q
Connection cn = ds.getConnection(); 92C; a5s
多用于jsp中 .!+7|us8l\
2、执行sql语句 ,h/l-#KS
1)用Statement来执行sql语句 =HV${+K=~
String sql; Brd9"M|d
Statement sm = cn.createStatement(); PRBlf
sm.executeQuery(sql); // 执行数据查询语句(select) =w:)AWZ
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 5yj# 9H
2)用PreparedStatement来执行sql语句 OTAe#]#
String sql; O:~J_Wwl!
sql = "insert into user (id,name) values (?,?)"; MXDCOe~07
PreparedStatement ps = cn.prepareStatement(sql); OZz!8-|wE
ps.setInt(1,xxx); ^B}q@/KV
ps.setString(2,xxx); `}L{gssv
... )J+A2>
ResultSet rs = ps.executeQuery(); // 查询 ~J#Z7y]p!j
int c = ps.executeUpdate(); // 更新 @J qo'\~&
M0?%r`
3、处理执行结果 d.Ccc/1-
查询语句,返回记录集ResultSet Wi,)a{
更新语句,返回数字,表示该更新影响的记录数 G^.tAO5:f
ResultSet的方法 s +qodb+
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 0r i
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 8<ev5af
yc`3)
4、释放连接 (c"!&&S^ =
cn.close(); ox\D04:M
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection R>&8%%#
\P"Ol\@
可滚动、更新的记录集 y!rJ}e
1、创建可滚动、更新的Statement .LnknjC
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 5:5d=7WX
该Statement取得的ResultSet就是可滚动的 ^
uwth
2、创建PreparedStatement时指定参数 <Ter\o5%
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); <9:~u]ixt
ResultSet.absolute(9000); 9d( M%F
批量更新
^^n (s_g
1、Statement u
i$4
Statement sm = cn.createStatement(); Bu?Qyz2O
sm.addBatch(sql1); E'6/@xM
sm.addBatch(sql2); 8A::q ;
... hM>.xr
sm.executeBatch() 8TU(5:xJo
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 %~>-nqS
2、PreparedStatement E`C!q
X>
PreparedStatement ps = cn.preparedStatement(sql); Oz&*A/si+3
{ Tdz#,]Q
ps.setXXX(1,xxx); knpdECq&k
... ~v:IgS
ps.addBatch(); ?|
6sTu!
} -okq=9
ps.executeBatch(); *DZ7,$LQ~D
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 \}Iq-Je
Y7I\<JG<
事务的处理 0V^I.S/q
1、关闭Connection的自动提交 Dbq/t^
cn.setAutoCommit(false); 2|WM?V&
2、执行一系列sql语句 fU$_5v4
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 59"tHb6 E
Statement sm ; >LH}A6dUC
sm = cn.createStatement(insert into user...); &RI;!qn6(
sm.executeUpdate(); R9"}-A
sm.close(); OA} r*Wz
sm = cn.createStatement("insert into corp...); 23,pVo
sm.executeUpdate(); J6>tGKa+e
sm.close(); P&@,Z#\
3、提交 7xux%:BN
cn.commit(); cnw+^8
4、如果发生异常,那么回滚 ?Pf#~U_
cn.rollback();