java 数据库基本操作 z\\[S@>pt
1、java数据库操作基本流程 e/KDw
2、几个常用的重要技巧: }/0X'o
可滚动、更新的记录集 \#2Z)Kz
批量更新 j"t(0m
事务处理 WrnrFz
g+8OekzB5
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 du
$:jN\}
1、取得数据库连接 "(3[+W{|
1)用DriverManager取数据库连接 Q,,e+exbb5
例子 6C1#/
String className,url,uid,pwd; bQzZy5,
className = "oracle.jdbc.driver.OracleDriver"; 1jmjg~W
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; JK7G/]j+Ez
uid = "system"; EKYY6S2
pwd = "manager"; P>y@kPi
Class.forName(className); :(E@Gf
Connection cn = DriverManager.getConnection(url,uid,pwd); 5N#aXG^9
2)用jndi(java的命名和目录服务)方式 A]_7}<<N
例子 NlA,'`,
String jndi = "jdbc/db"; oM
X
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); lF<]8m%F
DataSource ds = (DataSource) ctx.lookup(jndi); N~nziY*C,*
Connection cn = ds.getConnection(); +RHS!0
多用于jsp中 ^rB8? kt
2、执行sql语句 aj-Km`5r}
1)用Statement来执行sql语句 YU'k#\gi*
String sql; prUN)r@U
Statement sm = cn.createStatement(); &pxg.
3
sm.executeQuery(sql); // 执行数据查询语句(select) iOf<$f
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); $H2u.U<ip
2)用PreparedStatement来执行sql语句 *l(7D(#
String sql; WJ]T\DI
sql = "insert into user (id,name) values (?,?)"; *[Imn\hu
PreparedStatement ps = cn.prepareStatement(sql); H9Gh>u]}
ps.setInt(1,xxx); RF?`vRZOe
ps.setString(2,xxx); sbfuzpg]*
... O0*p0J
ResultSet rs = ps.executeQuery(); // 查询 F;Spi
int c = ps.executeUpdate(); // 更新 ` _6C{<O
H-!,yte
3、处理执行结果 9sM!`Lz{
查询语句,返回记录集ResultSet (=FRmdeYl1
更新语句,返回数字,表示该更新影响的记录数 .o6Or:L
ResultSet的方法 I:-Wy"i
1、next(),将游标往后移动一行,如果成功返回true;否则返回false P7ao5NP
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 3#n_?-
O"+gQXe
4、释放连接 kl"hBK#D%
cn.close(); "-Mp_O]
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection m=1N>cq
'
w$>u b@=
可滚动、更新的记录集 8:q1~`?5"b
1、创建可滚动、更新的Statement %6t:(z
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ./XYd"p
该Statement取得的ResultSet就是可滚动的 Ml`:UrU
2、创建PreparedStatement时指定参数 e_^26^{q
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 7kC^
30@T3
ResultSet.absolute(9000); +Z,;,5'5G
批量更新 2/U.|*mH
1、Statement qRu~$K
Statement sm = cn.createStatement(); -D<< kra
sm.addBatch(sql1); Q@= Q0
sm.addBatch(sql2); zWnX*2>b
... xPdG*OcX!
sm.executeBatch() \wmN
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 0RzEY!9g+
2、PreparedStatement JT~4mT
PreparedStatement ps = cn.preparedStatement(sql); I !-
U'{
{ C;v.S5x
ps.setXXX(1,xxx); {% 6}'
... 9FF0%*tGo
ps.addBatch(); 2V]UJ<
} #j;^\rSv-
ps.executeBatch(); IM*y|UHt
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 _OYasJUMG
2bz2KB5>
事务的处理 //B&k`u
1、关闭Connection的自动提交 -$\y_?}
cn.setAutoCommit(false); J@`1TU
2、执行一系列sql语句 mb1FWy=3
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close aI'&O^w+
Statement sm ; 3s*mbk[J
sm = cn.createStatement(insert into user...); A]*}HZ,
sm.executeUpdate(); 'z8pzMmT
sm.close(); )w em|:H
sm = cn.createStatement("insert into corp...); zE*li`@
sm.executeUpdate(); =&6eM2>P
sm.close(); JhYe6y[q
3、提交 Z<oaK
cn.commit(); *9
{PEx
4、如果发生异常,那么回滚 b\f
O8{k
cn.rollback();