java 数据库基本操作 e,X{.NS
1、java数据库操作基本流程 O: J;zv\
2、几个常用的重要技巧: Cqra\
可滚动、更新的记录集 @p\te7(P%
批量更新 5*#3v:l/9
事务处理 +lNAog
"J=A(w5
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 -Uo"!o>x|
1、取得数据库连接 ;+Sc Vz
1)用DriverManager取数据库连接 NDo>"in
例子 FSNzBN
String className,url,uid,pwd; .wPu
#*
className = "oracle.jdbc.driver.OracleDriver"; u,88V@^
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; y88lkV4a
uid = "system"; 9x]yu6
pwd = "manager"; a*N<gId
Class.forName(className); {0IC2jE
Connection cn = DriverManager.getConnection(url,uid,pwd); xE"QX
N
2)用jndi(java的命名和目录服务)方式 FWb`F&
例子 P.>5`^
String jndi = "jdbc/db"; M>xjs?{%k
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); <cUaIb;(4
DataSource ds = (DataSource) ctx.lookup(jndi); G?e\w+}Pj@
Connection cn = ds.getConnection(); qy^sdqHl@
多用于jsp中 92";?Xk
2、执行sql语句 fnJ!~b*qo
1)用Statement来执行sql语句 YsBOh{Ml
String sql; "3H?_!A9
Statement sm = cn.createStatement(); wc~k4B9"
sm.executeQuery(sql); // 执行数据查询语句(select) h4,S/n
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); CY?19Ak-xd
2)用PreparedStatement来执行sql语句 :&-j{8p-
String sql; p( 6!7t:
sql = "insert into user (id,name) values (?,?)";
An2Wj
PreparedStatement ps = cn.prepareStatement(sql); 6?uo6 I
ps.setInt(1,xxx); Z&MfE0F/B
ps.setString(2,xxx); <],~V\m
... bmd3fJb`r
ResultSet rs = ps.executeQuery(); // 查询 |Ev VS
int c = ps.executeUpdate(); // 更新 J69B1Yi
yu98d1
3、处理执行结果 .8~zgpK
查询语句,返回记录集ResultSet [}1+=Ub
更新语句,返回数字,表示该更新影响的记录数 ,enU`}9V*
ResultSet的方法 =AVr<kP
1、next(),将游标往后移动一行,如果成功返回true;否则返回false XT<{J8
0z
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 s4kkzTnXE3
y7LT;`A
4、释放连接 f{j.jfl\x
cn.close(); zjlo3=FQX[
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection .G/2CVMj
T!3_Q/~^r
可滚动、更新的记录集 `ZLA=oD
1、创建可滚动、更新的Statement dl;
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ]4
q6N
该Statement取得的ResultSet就是可滚动的 _rIFwT1]
2、创建PreparedStatement时指定参数 p J#<e
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 3A)Ec/;~
ResultSet.absolute(9000); ]R7zvcu&
批量更新 t9Y?0O}/
1、Statement Ip&Q'"HYj
Statement sm = cn.createStatement(); lr-:o@q{
sm.addBatch(sql1); kA/V=xO<
sm.addBatch(sql2); \66j4?H#
... 0<4Swj3s7
sm.executeBatch() m!H7;S-(
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 #>[5NQ;$'
2、PreparedStatement !tckE\ h#N
PreparedStatement ps = cn.preparedStatement(sql); 2[e^mm&.
{ ge@ KopZ&
ps.setXXX(1,xxx); 5IfyD ]<
... 0!(BbQnWI
ps.addBatch(); uNS ]n}
} c_+y~X)i
ps.executeBatch(); RLL2'8"A
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 =c1t]%P,
0f]LOg
事务的处理 nApkK1?
1、关闭Connection的自动提交
k\wcj^"cb
cn.setAutoCommit(false); ^a?H"
2、执行一系列sql语句 \}9GK`oR
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close J[7|Ul1
<
Statement sm ; {I"`(
sm = cn.createStatement(insert into user...); -'wFaW0%I
sm.executeUpdate(); (;1Pgh
sm.close(); H6! <y-
sm = cn.createStatement("insert into corp...); iTpU4Qsj
sm.executeUpdate(); <&Q(I+^
sm.close(); Ljq!\D
3、提交 dLnu\bSF
cn.commit(); ,f2tG+P
4、如果发生异常,那么回滚 [7|j:!
cn.rollback();