java 数据库基本操作 xcXnd"YYE
1、java数据库操作基本流程 ,@@FAL
2、几个常用的重要技巧: Z+S1e~~
可滚动、更新的记录集 R lmeZy4.
批量更新 U{0!
<*W>
事务处理 (0S;eM&
l]geQl:7`r
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ^A t,x
1、取得数据库连接 &jF[f4:7
1)用DriverManager取数据库连接 +2^Mz&I@b
例子 vb]H$@0
String className,url,uid,pwd; 2PVQSwW:
className = "oracle.jdbc.driver.OracleDriver"; esHcE{GNOS
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; TZE;$:1vx>
uid = "system"; +(o]E3
pwd = "manager"; T=T1?@2C
Class.forName(className); :>, m$XO
Connection cn = DriverManager.getConnection(url,uid,pwd); ap .L=vn
2)用jndi(java的命名和目录服务)方式 BGL-lJrG
例子 \7tJ)[0aF
String jndi = "jdbc/db"; c8qwsp
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); M{`uI8vD
DataSource ds = (DataSource) ctx.lookup(jndi); #j6qq3OG
Connection cn = ds.getConnection(); _n!W4zwi
多用于jsp中 axiP~t2
2、执行sql语句 jsIT{a*]
1)用Statement来执行sql语句 SHUn<+/e
String sql; jRSY`MU}t+
Statement sm = cn.createStatement(); zFO#oW,D
sm.executeQuery(sql); // 执行数据查询语句(select) -ob1_0
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); u~j&g
2)用PreparedStatement来执行sql语句 rPoq~p[Y
String sql; tD3v`Ke
sql = "insert into user (id,name) values (?,?)"; [O^mG
9
PreparedStatement ps = cn.prepareStatement(sql); Q~$hx{foN
ps.setInt(1,xxx); Gq;!g(
ps.setString(2,xxx); tp3
!6I6
... Z oQPvs7_
ResultSet rs = ps.executeQuery(); // 查询 G:!'hadw
int c = ps.executeUpdate(); // 更新 |Ht~o(]&&/
fTV}IP
3、处理执行结果 ?8@EBPpC
查询语句,返回记录集ResultSet kk7M$)>d
更新语句,返回数字,表示该更新影响的记录数 E'F87P ^>
ResultSet的方法 H mVpxD+
1、next(),将游标往后移动一行,如果成功返回true;否则返回false U
jB5Xks
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 d<afO?"
]MV=@T^8#
4、释放连接 A$XmO}+
cn.close(); 5$"IUq*
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection T Ue=Yj
`>skcvkm
可滚动、更新的记录集 rsC^Re:*jr
1、创建可滚动、更新的Statement f-a+&DB9
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); {t QZqqdn@
该Statement取得的ResultSet就是可滚动的 5jK9cF$>
2、创建PreparedStatement时指定参数 g,""j`
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); =&v&qne9
ResultSet.absolute(9000); }#QYZ nR
批量更新 e:zuP.R
1、Statement Q%^!j_#
Statement sm = cn.createStatement(); .V\:)\<|
sm.addBatch(sql1); Tq!.M1{&
sm.addBatch(sql2); s_Gf7uC
... jL9to6 Hmr
sm.executeBatch() |s*tRag
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ~ YCZvJ
2、PreparedStatement o_&*?k*
PreparedStatement ps = cn.preparedStatement(sql); XXZ <r
{ xC.Tipn>
ps.setXXX(1,xxx); "*0h=x$
... _t;Mi/\P
ps.addBatch(); !d3:`l<
} p+O,C{^f
ps.executeBatch(); #tQ__V
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 `{W>Dy
G}p*oz~
事务的处理 Q
a8;MxK`
1、关闭Connection的自动提交 Dro2R_j{
cn.setAutoCommit(false); b;Uqyc
2、执行一系列sql语句 +C){&/=#
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close u(Y?2R
Statement sm ; Y SD|#0
sm = cn.createStatement(insert into user...); a;[=bp
sm.executeUpdate(); a<mM
)[U
sm.close(); \XT~5N6
sm = cn.createStatement("insert into corp...); )MU)'1jc,
sm.executeUpdate(); o<nkK+=Afm
sm.close(); >.f'_2#Z&
3、提交 v* /}s :a
cn.commit(); `%A>{ A"
4、如果发生异常,那么回滚 {/PiX1mn
cn.rollback();