java 数据库基本操作 Os9SfL
1、java数据库操作基本流程 z
CLaHx!
2、几个常用的重要技巧: 5JzvT JMx
可滚动、更新的记录集 \|HtE(uCM1
批量更新 EX]+e
事务处理 a'VQegP(f\
J M`w6}
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 xi (@\A
1、取得数据库连接 0*{(R#
1)用DriverManager取数据库连接 \YvG+7a
例子 OUBGbld
String className,url,uid,pwd; [ws
_ g,/
className = "oracle.jdbc.driver.OracleDriver"; &N}"4
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; e9LX0=
uid = "system"; ~`
tuPk~l
pwd = "manager"; -@> {q/
Class.forName(className); i2<z"v63
Connection cn = DriverManager.getConnection(url,uid,pwd); u&zY>'}zm
2)用jndi(java的命名和目录服务)方式 #
-'A
=j
例子 lod+]*MD
String jndi = "jdbc/db"; m.<_WXH
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); {ZeY:\G~
DataSource ds = (DataSource) ctx.lookup(jndi); Fd9[Pe@?`
Connection cn = ds.getConnection(); U^PXpNQ'
多用于jsp中 3%POTAw%
2、执行sql语句 Y|tHU'x
1)用Statement来执行sql语句 `D+zX
String sql; Olzw)WjG
Statement sm = cn.createStatement(); E+L7[
sm.executeQuery(sql); // 执行数据查询语句(select) DGvuo 8
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 2
}xePX9?
2)用PreparedStatement来执行sql语句 qk& F>6<9*
String sql; {hS!IOM
sql = "insert into user (id,name) values (?,?)"; Rpn<"LIoB:
PreparedStatement ps = cn.prepareStatement(sql); I}8e"#
ps.setInt(1,xxx); @ m`C%7<
ps.setString(2,xxx); bDl:,7;
... /M2in]oH
ResultSet rs = ps.executeQuery(); // 查询 K=f4<tP_
int c = ps.executeUpdate(); // 更新 Clf$EX;~
b**vUt\
3、处理执行结果 =R5W
KX
查询语句,返回记录集ResultSet tD8fSV
更新语句,返回数字,表示该更新影响的记录数 LLx0X
O@
ResultSet的方法 Ca |}i+
1、next(),将游标往后移动一行,如果成功返回true;否则返回false *V&M5
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 :2/L1A)O
!9d7wPUFr
4、释放连接 +g1>h,K 3
cn.close(); H!;N0",]N
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection oG,>Pk
O,%UNjx9K
可滚动、更新的记录集 6P{bUom?
1、创建可滚动、更新的Statement y [Vd*8
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); +<E#_)}`D6
该Statement取得的ResultSet就是可滚动的 P'~`2W0sz
2、创建PreparedStatement时指定参数 >2#<gp3
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); v47' dC
ResultSet.absolute(9000); D.Ke
批量更新 V!:!c]8F
1、Statement e:G~P
u`
Statement sm = cn.createStatement(); ai 4 k?
sm.addBatch(sql1); eT%x(P
sm.addBatch(sql2); D,IT>^[^7
... k^7!iOK2
sm.executeBatch() W?Z>g"
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ILuQ.VhBVN
2、PreparedStatement (;fJXgj.
PreparedStatement ps = cn.preparedStatement(sql); 7-S?RU]g
{ dDS{XR
ps.setXXX(1,xxx); Xqf\}p n
... vP{i+s18B
ps.addBatch(); eU"yF >6'
} JA^!i98{
ps.executeBatch(); R>c>wYt'f
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 c]pz&
QQAEG#.5
事务的处理 "%T~d[M
1、关闭Connection的自动提交 #Y= A#Yz,{
cn.setAutoCommit(false); S.MRL,
2、执行一系列sql语句 >nkVZ;tL
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close FG${w.e<
Statement sm ; k8 #8)d
sm = cn.createStatement(insert into user...); TQB)
A9
sm.executeUpdate(); MZ38=nJ
sm.close(); s9C^Cy^su
sm = cn.createStatement("insert into corp...); 0H_Ai=G
sm.executeUpdate(); qT?{}I
sm.close(); RLf-Rdx/
3、提交 )?{<Tt@
cn.commit(); J`g5Qn@S
4、如果发生异常,那么回滚 9d1km~
cn.rollback();