java 数据库基本操作 3R1v0
1、java数据库操作基本流程 8_US.52V
2、几个常用的重要技巧: y*0bHzJ
可滚动、更新的记录集 .E-)R
批量更新 R*lJe6
事务处理 '#mv- /<t*
|QHDg(
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 })#6BN
1、取得数据库连接 ak 94"<p
1)用DriverManager取数据库连接 Xp"ZK=r
例子 4:GVZR|-
String className,url,uid,pwd;
M<hX!B
className = "oracle.jdbc.driver.OracleDriver"; qn}4PVn4
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; g]PmmK_L
uid = "system"; `bw>.Ay
pwd = "manager"; Squ'd
Class.forName(className); FGo{6'K(:
Connection cn = DriverManager.getConnection(url,uid,pwd); GLrHb3@"N
2)用jndi(java的命名和目录服务)方式 bx`s;r=
例子 tn&~~G~#
String jndi = "jdbc/db";
3=@94i
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 5TqB&GP0
DataSource ds = (DataSource) ctx.lookup(jndi); :QT0[P5O
Connection cn = ds.getConnection(); 0l=g$G
\%
多用于jsp中 G[z!;Zuf
2、执行sql语句 ^vPM\qP#g
1)用Statement来执行sql语句 9(g?{ 6v|
String sql; &i179Qg!
Statement sm = cn.createStatement(); xs y5"
sm.executeQuery(sql); // 执行数据查询语句(select) FvQ>Y')R7Z
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); #!(OTe L
2)用PreparedStatement来执行sql语句 ,)^4H>~V
String sql; OBp<A+a
sql = "insert into user (id,name) values (?,?)"; BO)K=gl;8
PreparedStatement ps = cn.prepareStatement(sql); :Lu=t3#
ps.setInt(1,xxx); W9nmTz\8
ps.setString(2,xxx); LxaR1E(Cc'
... qOAK`{b
ResultSet rs = ps.executeQuery(); // 查询 Qxr&zT7f
int c = ps.executeUpdate(); // 更新 #\U;,r
\6~(#y
3、处理执行结果 ~ HFDX@m*
查询语句,返回记录集ResultSet 'au7rX(
更新语句,返回数字,表示该更新影响的记录数 5xKo(XNp
ResultSet的方法 u
hW@
Y+
1、next(),将游标往后移动一行,如果成功返回true;否则返回false %s<7M@]f
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 b3]QH
h/
8L]em&871
4、释放连接 ]w ^9qS
cn.close(); i7]\}w|
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ',`GdfAsH
3.,O7 k7y
可滚动、更新的记录集 S?TyC";!
1、创建可滚动、更新的Statement (|H1zO
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); <d!_.f}v
该Statement取得的ResultSet就是可滚动的 qXC>DGy
2、创建PreparedStatement时指定参数 g*t(%;_m
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); iv@ey-,<
ResultSet.absolute(9000); OtK=UtVI
批量更新 VA{2a7]
1、Statement cYHHCaCS
Statement sm = cn.createStatement(); ], Xva`"
sm.addBatch(sql1); gbF^m`A>%+
sm.addBatch(sql2); }@JPvIE
... 4mNg(w=NF
sm.executeBatch() v53qpqc
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 &+]x
2、PreparedStatement rBR,lS$4
PreparedStatement ps = cn.preparedStatement(sql); 7L68voC@U
{ rik-C7
ps.setXXX(1,xxx); ,FWC|uM"
... AY3nQH
ps.addBatch(); ^W}(]jL
} \H
<k
ps.executeBatch(); ON"F
h'?
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 8:s"
^YLN
mc37Y.
事务的处理 M;s r1C
1、关闭Connection的自动提交 6XU1w
cn.setAutoCommit(false); 8JYF0r7
2、执行一系列sql语句 \Eqxmo
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close %C}TdG(C
Statement sm ; `x%(
n@ g
sm = cn.createStatement(insert into user...); VsLlPw{
sm.executeUpdate(); aNn\URR
sm.close(); h,QC#Ak o
sm = cn.createStatement("insert into corp...); *2wFLh
sm.executeUpdate(); 6%N.'wf
sm.close(); Lckb*/jV&
3、提交 <*O~?=6p
cn.commit(); QAs$fi}f]s
4、如果发生异常,那么回滚 wCT. (d_
cn.rollback();