java 数据库基本操作 e$rPXRf
1、java数据库操作基本流程 A#i[Us|
2、几个常用的重要技巧: 7lwFxP5QT
可滚动、更新的记录集 XSh[#qJ
批量更新 &W `7 b<
事务处理 ]z#Ita;
''z]o#=^9
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ;!3: 3;
1、取得数据库连接 P1$D[aF9$
1)用DriverManager取数据库连接 X_,R!$wbg:
例子 (FGHt/!
String className,url,uid,pwd; |S:erYE,G
className = "oracle.jdbc.driver.OracleDriver"; 'jye*
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; $uRi/%Q9
uid = "system"; $}us+hGZ
pwd = "manager"; -<" ;|v4
Class.forName(className); {/48n83n
Connection cn = DriverManager.getConnection(url,uid,pwd); ,*m|Lt%;R
2)用jndi(java的命名和目录服务)方式 'S&Zq:
例子 {*
w _*
String jndi = "jdbc/db"; ETdN<}m
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); :$P1ps3B
DataSource ds = (DataSource) ctx.lookup(jndi); d%E*P4Ua
Connection cn = ds.getConnection(); GR 1%(,
多用于jsp中 l2Rnyb<;;
2、执行sql语句 it-2]Nw
1)用Statement来执行sql语句 E!L_"GW
String sql; J5xZLv
Statement sm = cn.createStatement(); T~g`;Q%i
sm.executeQuery(sql); // 执行数据查询语句(select) -"#jRP]#
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); _U^G*EqL*
2)用PreparedStatement来执行sql语句 vCOtED*<
String sql; 2gEF$?+q?
sql = "insert into user (id,name) values (?,?)"; K&T.~2'>
PreparedStatement ps = cn.prepareStatement(sql); ,,ML^ey
ps.setInt(1,xxx); %<U0
ps.setString(2,xxx); L2%D$!9
... ]bstkf}~u
ResultSet rs = ps.executeQuery(); // 查询 /`y^z"!
int c = ps.executeUpdate(); // 更新 t7,$u-
p+7#`iICE
3、处理执行结果 4|4[3Ye7u:
查询语句,返回记录集ResultSet WB `h)
更新语句,返回数字,表示该更新影响的记录数 zp``e;gY
ResultSet的方法 vM:c70=
1、next(),将游标往后移动一行,如果成功返回true;否则返回false t=jG $A
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ^U,Dx
gplrJaH@
4、释放连接 i#*lK7
cn.close(); 7[0CVWs,
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 4jjo%N
}I18|=TB
可滚动、更新的记录集 J(P'!#z^
1、创建可滚动、更新的Statement DH4IF i>
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); PM&NY8|Zy
该Statement取得的ResultSet就是可滚动的 ^_W] @m2
2、创建PreparedStatement时指定参数 j^h:*rw
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); J'k^(ZZ
ResultSet.absolute(9000); 8VC%4+.FF
批量更新 tOo\s&j
1、Statement ogJ';i/o
Statement sm = cn.createStatement(); ([7XtG/?
sm.addBatch(sql1); \vS >jB
sm.addBatch(sql2); z&jASL
... ~b4kV)[ q
sm.executeBatch() u
Qg$hS
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 N-45LS@
2、PreparedStatement b8Hzl!zO
PreparedStatement ps = cn.preparedStatement(sql); kN 0N18E
{ I\IDt~
ps.setXXX(1,xxx); ]x%sX|Rj
... jc,Qg2
ps.addBatch(); -av=5hm
} n{M-t@r7
ps.executeBatch(); )d|s$l$?7
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 #6pJw?[
,)VAKrSg
事务的处理 {j4&'=C:
1、关闭Connection的自动提交 JcfGe4
cn.setAutoCommit(false); ZzP&Zrm
2、执行一系列sql语句 oqg +<m
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ,v?FR
}v
Statement sm ; d\8j!F^=
sm = cn.createStatement(insert into user...); TFzk5
sm.executeUpdate(); ~c*kS E2X
sm.close(); T#vY(d
sm = cn.createStatement("insert into corp...); Rv.IHSQUo
sm.executeUpdate(); vV"I}L
sm.close(); QcjsQTAbk
3、提交 2av=W
cn.commit(); NiRb:F-
4、如果发生异常,那么回滚 6:Y2z!MLO
cn.rollback();