java 数据库基本操作 |XG&[TI- "
1、java数据库操作基本流程 ,9I-3**W
2、几个常用的重要技巧: :/5GHfyj
可滚动、更新的记录集 ?0KIM*
.
批量更新 6la'\l#
事务处理 V3cKdlu Na
LprGsqr:
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 3w |5%`
1、取得数据库连接 )7+z/y+[n
1)用DriverManager取数据库连接 Vq-Kl[-|
例子 `p* 43nV
String className,url,uid,pwd; aN*{nW
className = "oracle.jdbc.driver.OracleDriver"; PknKzrEG:>
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 0L32sFy
uid = "system"; Uvc$&j^k
pwd = "manager"; t}Td$K7
Class.forName(className); z?Z"*z
Connection cn = DriverManager.getConnection(url,uid,pwd); iJoYxx
2)用jndi(java的命名和目录服务)方式 `<v$+mG
例子 Z}vDP^rf
String jndi = "jdbc/db";
Pvt!G
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); W*_c*
DataSource ds = (DataSource) ctx.lookup(jndi); <N~9=g3
Connection cn = ds.getConnection(); j[\:#/J
多用于jsp中 D bi ^%
2、执行sql语句 T!9AEG
1)用Statement来执行sql语句 B?^~1Ua9Zv
String sql; )nj fqg
Statement sm = cn.createStatement(); >2),HZp^I
sm.executeQuery(sql); // 执行数据查询语句(select) P=<lY},
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); rf@47H
2)用PreparedStatement来执行sql语句 @uV]7d"z(
String sql; M1NdlAAf
sql = "insert into user (id,name) values (?,?)"; D~i 5E9s5
PreparedStatement ps = cn.prepareStatement(sql); !Z\Gv1
ps.setInt(1,xxx); 3`{
vx
ps.setString(2,xxx); J|
wk})?
... FF^h(Ea
ResultSet rs = ps.executeQuery(); // 查询 wM7Iu86
int c = ps.executeUpdate(); // 更新 XMZ$AeF@
iQ2}*:Jc$
3、处理执行结果 RkF^V(
查询语句,返回记录集ResultSet $*N(feAs
更新语句,返回数字,表示该更新影响的记录数 Ev3'EA~`
ResultSet的方法 C:^
:^y
1、next(),将游标往后移动一行,如果成功返回true;否则返回false $]};EI#
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 "mE/t (
i!UT =
4、释放连接 k}nGgd6XD
cn.close(); x_<#28H!
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection `~VL&o1>
pYAKA1F
可滚动、更新的记录集 }m^^6h
1、创建可滚动、更新的Statement r9M3rj]
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); +'93%/:
该Statement取得的ResultSet就是可滚动的 YG=:lf
2、创建PreparedStatement时指定参数 M,ybj5:6
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); hPG@iX|V
ResultSet.absolute(9000); )l
m7ly8a|
批量更新 t$VRNZ`dy
1、Statement "0 %fR"
Statement sm = cn.createStatement(); ?,v&
o>*
sm.addBatch(sql1); VCnf`wZB"
sm.addBatch(sql2); Zon7G6s9`
... :a2[d1
sm.executeBatch() G~u$BV'
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 nr&|
2、PreparedStatement wX6-WQR
PreparedStatement ps = cn.preparedStatement(sql); ~}ifwm'7 a
{ 7CF>cpw
ps.setXXX(1,xxx); ^pew'pHQ
... F,VWi$Po\N
ps.addBatch(); \/SOpC
} SD%3B!cpX
ps.executeBatch(); q\jq9)
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 e2V;6N
ft@#[Bkx
事务的处理 GoX<d{
1、关闭Connection的自动提交 <1lB[:@%U
cn.setAutoCommit(false); _ Dz*%
2、执行一系列sql语句 Ho(}_Q&
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close I
H#CaD
Statement sm ; .L1[Rv3
sm = cn.createStatement(insert into user...); Z<AZO ^
sm.executeUpdate(); bYem0hzOe
sm.close(); {0fQE@5@
sm = cn.createStatement("insert into corp...); FxK!h.C.
sm.executeUpdate(); 'ta&qp
sm.close(); b W/T}FND
3、提交 7 u Q +]d
cn.commit(); jg%mWiKwK7
4、如果发生异常,那么回滚 Oi~Dio_?
cn.rollback();