java 数据库基本操作 -^Xy%
1、java数据库操作基本流程 'G8 ?'u_)
2、几个常用的重要技巧: 8.yCA
可滚动、更新的记录集 c_#*mA"+
批量更新 Rv<L#!;
t
事务处理 fz3lR2~G
{(}yG_Q]!
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 *hF^fxLbl
1、取得数据库连接 09d9S`cS\
1)用DriverManager取数据库连接 <#y*h8IZ@t
例子 wX0l?xdI
String className,url,uid,pwd; _8^0!,j
className = "oracle.jdbc.driver.OracleDriver"; Q ]"jD#F
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; =2%VZE7Vm
uid = "system"; $eBQH
pwd = "manager"; o&z!6"S<
Class.forName(className); \,R!S /R#
Connection cn = DriverManager.getConnection(url,uid,pwd); %G[/H.7s-
2)用jndi(java的命名和目录服务)方式 F;P5D<
例子 &cc9}V)M
String jndi = "jdbc/db"; s)ky/ce
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); )t%h[0{{
DataSource ds = (DataSource) ctx.lookup(jndi); RDJ+QOVKg
Connection cn = ds.getConnection(); oxfF`L"
多用于jsp中 <B)
2、执行sql语句 :3^dF}>
1)用Statement来执行sql语句 p x#suy
String sql; W pN.]x
Statement sm = cn.createStatement(); 90fs:.
sm.executeQuery(sql); // 执行数据查询语句(select) KQ{Lt?S
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); qnJ50 VVW
2)用PreparedStatement来执行sql语句 59<hV?
String sql; zsVcXBz
sql = "insert into user (id,name) values (?,?)"; XQ?fJWLU
PreparedStatement ps = cn.prepareStatement(sql); \GL*0NJ
ps.setInt(1,xxx); OxQYNi2
ps.setString(2,xxx); 6\n?48x}
... zTY;8r+
ResultSet rs = ps.executeQuery(); // 查询 mj2Pk,,SA
int c = ps.executeUpdate(); // 更新 jO8X:j09A
8KMvAc
3、处理执行结果 ETfF5i}
查询语句,返回记录集ResultSet <6jFKA<
更新语句,返回数字,表示该更新影响的记录数 CZ(`|;BC*
ResultSet的方法 k!3 cq)
1、next(),将游标往后移动一行,如果成功返回true;否则返回false GoIQ>n
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 O~PChUU*Y
0Z
HDBh
4、释放连接 &94W-zh
cn.close(); c-B/~&
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection R0wf#%97
aQUGNa0+d
可滚动、更新的记录集 pOA!#Aj)
1、创建可滚动、更新的Statement BpH%STEN
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); VEs5;]#<2D
该Statement取得的ResultSet就是可滚动的 G\=_e8(
2、创建PreparedStatement时指定参数 Kkv<"^H
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Z\ )C_p\-
ResultSet.absolute(9000); %;|0
批量更新 d1]i,C~Y
1、Statement H0>yi[2f
Statement sm = cn.createStatement(); f~ZEdq8
sm.addBatch(sql1); hw=GR_,
sm.addBatch(sql2); 89HsPB1"t
... #jA) >z\Q^
sm.executeBatch() ,j178EX
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 0<.RA%dj
2、PreparedStatement "0Q1qZ
PreparedStatement ps = cn.preparedStatement(sql); .Djta|puu
{ sgAzL
ps.setXXX(1,xxx); XAuI7e
... "=A>}q@;H
ps.addBatch(); rs]I
} HBiBv-=,
ps.executeBatch(); ho.(v;
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ~L{l+jK$p
{(tHk_q
事务的处理 b>11h
1、关闭Connection的自动提交 fS=hpL6]@
cn.setAutoCommit(false); O{]9hm(tN
2、执行一系列sql语句 JOD/Raq.1k
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Ig \#f
Statement sm ; h|)vv4-d|
sm = cn.createStatement(insert into user...); lV6dm=k
sm.executeUpdate(); PsnGXcj
sm.close(); ke%pZ7{u
sm = cn.createStatement("insert into corp...); 8P2 J2IU
sm.executeUpdate(); )Gk`[*q ;
sm.close(); s_Wyh
!@M
3、提交 `u
XQ z7
cn.commit(); X2yTlLdY
4、如果发生异常,那么回滚 XP3xJm3
cn.rollback();