java 数据库基本操作 ="('
#o
1、java数据库操作基本流程 gSk0#Jt
2、几个常用的重要技巧: w }=LC#le
可滚动、更新的记录集 pf`vH`r
批量更新 {+^&7JX
事务处理 Rn $TYCO
I]-"Tw
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Zs|m_O G
1、取得数据库连接 STL+tLJ
1)用DriverManager取数据库连接 B%I<6E[D
例子 z7s}-w,
String className,url,uid,pwd; veAdk9
className = "oracle.jdbc.driver.OracleDriver"; E h+m|A
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; @:/H)F^x
uid = "system"; IMSLHwZ
pwd = "manager"; T0X+\&W
Class.forName(className); 0TqIRUz "C
Connection cn = DriverManager.getConnection(url,uid,pwd); em9nuXG
2)用jndi(java的命名和目录服务)方式 cB6LJ}R
例子 $EnBigb!
String jndi = "jdbc/db"; AQGl}%k_
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 2AXf'IOqE
DataSource ds = (DataSource) ctx.lookup(jndi); ':7gYP*v
Connection cn = ds.getConnection(); Y~B-dx'V
多用于jsp中 > ofWHl[-
2、执行sql语句 WS.lDMYE7
1)用Statement来执行sql语句 QKI g5I-
String sql; MmQk@~
Statement sm = cn.createStatement(); \gGTkH
sm.executeQuery(sql); // 执行数据查询语句(select) V
X.9mt
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Aj*|r
2)用PreparedStatement来执行sql语句 XC!Y {lp
String sql; f_z]kA
+H
sql = "insert into user (id,name) values (?,?)"; T2_b5j3i
PreparedStatement ps = cn.prepareStatement(sql); Y;{(?0
s
ps.setInt(1,xxx); Ce:w^P+
ps.setString(2,xxx); $#-O^0D
... Z_4|L+i<{
ResultSet rs = ps.executeQuery(); // 查询 avY<~-44B
int c = ps.executeUpdate(); // 更新 .naSK`J,`
7 &iav2q
3、处理执行结果 J|u_45<
查询语句,返回记录集ResultSet /], 9N
更新语句,返回数字,表示该更新影响的记录数 +yxL}=4s
ResultSet的方法 +W"DN5UV
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Tq,dlDDOR
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 -#Jp@6'k%
w7~cY=
4、释放连接 'F^1)Ga$
cn.close(); =C-
b#4Q
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection E/2_@&U:}
`Krk<G
可滚动、更新的记录集 y=2nV
1、创建可滚动、更新的Statement AEd9H
+I
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 9z+ZFIf7d
该Statement取得的ResultSet就是可滚动的 :pLaxWus!
2、创建PreparedStatement时指定参数 +t8#rT ^B
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); A3.*d:A
ResultSet.absolute(9000);
|`pDOd
批量更新 O jH"qi
1、Statement dN@C)5pm5`
Statement sm = cn.createStatement(); UHS"{%
sm.addBatch(sql1); {$I1(DYN
sm.addBatch(sql2); L=gG23U&
... @CS%=tE}U
sm.executeBatch() !
u9LZ
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ;( (|0Xa
2、PreparedStatement V6&6I
PreparedStatement ps = cn.preparedStatement(sql); J;N\q
{ %?BygG
ps.setXXX(1,xxx); |#sY(1
... yeLd,M/I
ps.addBatch(); S;tvt/\!Z
} T~
P<Gq},
ps.executeBatch(); k54b@U52 h
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 pp+z5
}J6 y NoXu
事务的处理 $mxl&Qr>Q;
1、关闭Connection的自动提交 ]]T,;|B
cn.setAutoCommit(false); _FCg5F2U
2、执行一系列sql语句 ~En]sj
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close MaZVGrcC
Statement sm ; hV NT
sm = cn.createStatement(insert into user...); @+sYwlA~
sm.executeUpdate(); SP;1XXlL
sm.close(); aWY#gI{
sm = cn.createStatement("insert into corp...); #&Rx?V
sm.executeUpdate(); Y+gNi_dE
sm.close(); W$J@|i
3、提交 "}b/[U@>
cn.commit(); AG|:mQO
4、如果发生异常,那么回滚 /k KVIlO
cn.rollback();