java 数据库基本操作 LNa $
X5`
1、java数据库操作基本流程 7hi"6,
2、几个常用的重要技巧: ,Vh{gm1
可滚动、更新的记录集 ^ mS
o1?<
批量更新 |6(ZD^w
事务处理 B"v.*
%"&/
KGWyJ
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 nIoPC[%_
1、取得数据库连接 `8I&7c
1)用DriverManager取数据库连接 g=]u^&
例子 Oer^Rk
String className,url,uid,pwd; .>mr%#p
className = "oracle.jdbc.driver.OracleDriver"; sp
]zbX?
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; .{=$!8|&I9
uid = "system"; [<{Kw=X__2
pwd = "manager"; x)JOClLr
Class.forName(className); cP}KU 5j
Connection cn = DriverManager.getConnection(url,uid,pwd); gF0q@M y~
2)用jndi(java的命名和目录服务)方式 }>'PT-
例子 K"0PTWt
String jndi = "jdbc/db"; j8n4fv-)f
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); v$7EvFS
DataSource ds = (DataSource) ctx.lookup(jndi); LK;k'IJ
Connection cn = ds.getConnection(); \igmv]G%
多用于jsp中 G
<uyin>
2、执行sql语句 GQl$yZaK{
1)用Statement来执行sql语句 E-{^E. w1
String sql; Cxcr/9
Statement sm = cn.createStatement(); l%`F&8K
sm.executeQuery(sql); // 执行数据查询语句(select) TD9;kN1`
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 8-lOB
2)用PreparedStatement来执行sql语句 5 gv/Pq &
String sql;
WJ
d%2pO]
sql = "insert into user (id,name) values (?,?)"; s-RQMK}H
PreparedStatement ps = cn.prepareStatement(sql); ~j#]tElb
ps.setInt(1,xxx); :T._ba3|
ps.setString(2,xxx); v\,N 5
... ,i0b)=!o
ResultSet rs = ps.executeQuery(); // 查询 ~\cO"(y5:O
int c = ps.executeUpdate(); // 更新 f_imyzP
581e+iC~<H
3、处理执行结果 js8{]04y
查询语句,返回记录集ResultSet b.@P%`@a.
更新语句,返回数字,表示该更新影响的记录数 E!Zx#XP1
ResultSet的方法 0z[dlHi
1、next(),将游标往后移动一行,如果成功返回true;否则返回false k $fGom
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ?0
m\(#
vNeCpf
4、释放连接 .!6>oL/iF
cn.close(); tU^kQR!
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection +4,2<\fX
5hbJOo0BZ
可滚动、更新的记录集 h8X g`C\
1、创建可滚动、更新的Statement $rhgzpZ!X_
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); e{A9r@p!
该Statement取得的ResultSet就是可滚动的 +MB!B9M@
2、创建PreparedStatement时指定参数 b-Z4
Jo
G
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); wBInq~K_
ResultSet.absolute(9000); xxm%u9@s
批量更新 v"MX>^/<
1、Statement ] )"u+
Statement sm = cn.createStatement(); {w8 NN-n
sm.addBatch(sql1); U^.4Hy&D
sm.addBatch(sql2); )OLq_':^@
... TP}h~8 /;
sm.executeBatch() R.s^o]vT
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 eVR5Xar
2、PreparedStatement v$)q($}p
PreparedStatement ps = cn.preparedStatement(sql); A+&xMM2Wj
{ 2TES>}
ps.setXXX(1,xxx); &I({T`=
...
c\q
ps.addBatch(); r,]#b[:.s|
} QeDQo
ps.executeBatch(); ?hR7<02
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ~=wCwA|1
Dgql?+2$
事务的处理 9M /SH$Qy
1、关闭Connection的自动提交 `s]4AKBO
cn.setAutoCommit(false); =rd|0K"(r
2、执行一系列sql语句 4#(ZNP
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 9~0^PzTA
Statement sm ; teW6;O_
sm = cn.createStatement(insert into user...); `T2$4 >!
sm.executeUpdate(); j6,ZEm
sm.close(); IF +i3#$
sm = cn.createStatement("insert into corp...); 6ATtW+sN ]
sm.executeUpdate(); Ox#Q2W@Uy
sm.close(); KT.?Xp:z
3、提交 ]=EM@
cn.commit(); 7JDN{!jT
4、如果发生异常,那么回滚 ]O`
{dnP
cn.rollback();