java 数据库基本操作 Ls2g#+
1、java数据库操作基本流程 T$pBgS>
2、几个常用的重要技巧: sMDHg
可滚动、更新的记录集 ',l}$]y5
批量更新 q_b,3Tp
事务处理 @\?QZX(H
qZB}}pM#
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ;8iK] ;^
1、取得数据库连接 Z[%vO?,
1)用DriverManager取数据库连接 ++|vy~T
例子 7f_tH_(
String className,url,uid,pwd;
) k6O
className = "oracle.jdbc.driver.OracleDriver"; caD| *.b
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; O
<#H5/Tq
uid = "system"; 48g`i
pwd = "manager"; zcCGREe=
Class.forName(className);
-P>up)p
Connection cn = DriverManager.getConnection(url,uid,pwd); >`)IdX
2)用jndi(java的命名和目录服务)方式 |S.;']t+
例子 !McRtxq?~
String jndi = "jdbc/db"; M|9=B<6`7
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); k3VRa|Y")
DataSource ds = (DataSource) ctx.lookup(jndi); ?L(y8b}F(
Connection cn = ds.getConnection(); 8I)}c1j`v
多用于jsp中 met`f0jw
2、执行sql语句 mNdEn<W
1)用Statement来执行sql语句 )2g-{cYv
String sql; BW5! @D2
Statement sm = cn.createStatement(); p`T,VU&.
sm.executeQuery(sql); // 执行数据查询语句(select) hNUkaP
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); kx6-8j3gD7
2)用PreparedStatement来执行sql语句 #4wia%}u
String sql; ~(Xzm
sql = "insert into user (id,name) values (?,?)";
v7#`b}'W
PreparedStatement ps = cn.prepareStatement(sql); vI5'npM
ps.setInt(1,xxx); _2wH4^Vb
ps.setString(2,xxx); `#y?:s]e
... Ns5'K^
ResultSet rs = ps.executeQuery(); // 查询 bTJ l
int c = ps.executeUpdate(); // 更新 BU=;rz!;
^7-l<R[T
3、处理执行结果 XyrQJ}WR|
查询语句,返回记录集ResultSet bY!1t}ALh
更新语句,返回数字,表示该更新影响的记录数 DQyy">]Mh
ResultSet的方法 ty-erdsP
1、next(),将游标往后移动一行,如果成功返回true;否则返回false m=Fk
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Eq/oq\(/6
u3])_oj=
4、释放连接 <)9dTOdd
cn.close(); ~xakz BE
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 0o_wy1O1,
.xV^%e?H
可滚动、更新的记录集 -YJ4-]Z
1、创建可滚动、更新的Statement o~tL;(sz
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 5rUDRFO6
该Statement取得的ResultSet就是可滚动的 29kR7[k
2、创建PreparedStatement时指定参数 =+"=|cQ
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 9ELRn@5.
ResultSet.absolute(9000); (hn;C>B
批量更新 oa2v/P1`
1、Statement XI7:y4M
Statement sm = cn.createStatement(); P)rz%,VF+
sm.addBatch(sql1); &T2qi'
sm.addBatch(sql2); Z<W`5sop^
... d 8%sGH
sm.executeBatch() W'}^m*F
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 $Fik]TbQp
2、PreparedStatement E)]RQ~jY?
PreparedStatement ps = cn.preparedStatement(sql); \z[L=
{ 1,Ji|&Pwf
ps.setXXX(1,xxx); /\u1q<
... ZDTp/5=?K/
ps.addBatch(); d6+{^v$#
} [$FiXH J
ps.executeBatch(); r"W,G/;h
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 H:!pFj
n2;Vrs,<1&
事务的处理 4)+L(KyB2
1、关闭Connection的自动提交 c'&\[b(m
cn.setAutoCommit(false); Y JMaIFt
2、执行一系列sql语句 U2kl-E:
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 3iBUIv
Statement sm ; [28Vf"#]
sm = cn.createStatement(insert into user...); {D7v[P+
sm.executeUpdate(); I.hy"y2&
sm.close(); 08F~6e6a8
sm = cn.createStatement("insert into corp...); uL9O_a;!
sm.executeUpdate(); B'!I{LC
sm.close(); eg(1kDMpn
3、提交 L]#b=Y
cn.commit(); Be~In~~
4、如果发生异常,那么回滚 MVOWJaT(Aq
cn.rollback();