java 数据库基本操作 G65N:
1、java数据库操作基本流程 ~x:]ch|
2、几个常用的重要技巧: :\_MA^<
可滚动、更新的记录集 F.D1;,x
批量更新 c^IEj1@}'?
事务处理 (q N(#~
H@'
@xHv
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ;[ueNP%*y|
1、取得数据库连接 I/jr`3Mj
1)用DriverManager取数据库连接 4
G[hU4L
例子 Yur)_m
String className,url,uid,pwd; @/L. BfTz
className = "oracle.jdbc.driver.OracleDriver"; u0b-JJ7)BQ
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; sEyl\GL
uid = "system"; S45>f(!
pwd = "manager"; TP::y
Class.forName(className); j:3Hm0W3
Connection cn = DriverManager.getConnection(url,uid,pwd); Ai18]QD-
2)用jndi(java的命名和目录服务)方式 u$8MVP
例子 Cl!jK^AbG
String jndi = "jdbc/db"; wtS*w
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ,&]`
b#Rc
DataSource ds = (DataSource) ctx.lookup(jndi); CJ
Connection cn = ds.getConnection(); t}*!UixE
多用于jsp中 /8\&f%E
2、执行sql语句 +Uq:sfj,
1)用Statement来执行sql语句 1C=P #MU`
String sql; /ASI0h
Statement sm = cn.createStatement(); P'9io!Z-s
sm.executeQuery(sql); // 执行数据查询语句(select) 3G|fo4g
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Y26l,XIV
2)用PreparedStatement来执行sql语句 `0|&T;7
String sql; 8T
)ELhTj
sql = "insert into user (id,name) values (?,?)"; JSK5x(GlH
PreparedStatement ps = cn.prepareStatement(sql); -U[`pUY?f
ps.setInt(1,xxx); y|{?>3
ps.setString(2,xxx); \'Kj.EO{?$
... #`0z=w/)
ResultSet rs = ps.executeQuery(); // 查询 ya g
int c = ps.executeUpdate(); // 更新 }#5roNH~Z
ItE~MJ5p
3、处理执行结果 a' o8n6i
查询语句,返回记录集ResultSet =[os<+
更新语句,返回数字,表示该更新影响的记录数 h\\2r>
ResultSet的方法 bCUh^#]x
1、next(),将游标往后移动一行,如果成功返回true;否则返回false os^SD&hL
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 M|e
n>P
9= $,] M
4、释放连接 O \8G~V
5"
cn.close(); Ia:puks=
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection mIEaWE;E"
_J~ta.
可滚动、更新的记录集 ik0Q^^1?Y
1、创建可滚动、更新的Statement ULmdt
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); {0WIDD
该Statement取得的ResultSet就是可滚动的 s^'#"`!v=
2、创建PreparedStatement时指定参数 M`pTT5r
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); oHd0
<TO
ResultSet.absolute(9000); .+L_!A
批量更新 l!V| T?
1、Statement
0lr4d Y
Statement sm = cn.createStatement(); aw%vu
sm.addBatch(sql1); )"jn{%/t
sm.addBatch(sql2); L4*fF
... K |} ]<
sm.executeBatch() JD`;,Md
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 3l(;Pt-yI
2、PreparedStatement ,h.Jfo54,
PreparedStatement ps = cn.preparedStatement(sql); hs_|nr0;[
{ 5>[sCl-
ps.setXXX(1,xxx); ~V"cLTj"
... C|IQM4
ps.addBatch(); ur,"K'w
} bTy)0ta>AF
ps.executeBatch(); f<4q ]HCa
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 )X!DCL:16
| 4oM+n;Y
事务的处理 JX$NEq(
1、关闭Connection的自动提交 (g2r\hI
cn.setAutoCommit(false); @3TkD_B&
2、执行一系列sql语句 qs1.@l("
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 5@t uo`k
Statement sm ; A+1]Ql)$
sm = cn.createStatement(insert into user...); ~K$"PKs3
sm.executeUpdate(); 7cP[o+
sm.close(); xc<eU`-'b
sm = cn.createStatement("insert into corp...); 1S]gD&V
sm.executeUpdate(); _.*4Y
sm.close(); :Z]hI+7
3、提交 ~7 L)n
cn.commit(); bo !]
4、如果发生异常,那么回滚 ~eOj:H
cn.rollback();