java 数据库基本操作 IWYQ67Yj
1、java数据库操作基本流程 Kjbk
zc1
2、几个常用的重要技巧: Sk
EI51]
可滚动、更新的记录集 Op0*tj2i),
批量更新 Um/l{:S
事务处理 Zwq\m.h
emQc%wd{
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 8K2 @[TE=5
1、取得数据库连接 M?8sy
1)用DriverManager取数据库连接 3^KR{N p
例子 v[|-`e*
String className,url,uid,pwd; uWx<J3~q.
className = "oracle.jdbc.driver.OracleDriver"; YXo?(T..
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; L%H\|>k`
uid = "system"; MO0t
pwd = "manager"; yoGG[l2k>s
Class.forName(className); & *tL)qKDc
Connection cn = DriverManager.getConnection(url,uid,pwd); O+&;,R:
2)用jndi(java的命名和目录服务)方式 wHbmK
例子 f5//?ek
String jndi = "jdbc/db"; a)lCp
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); j f4<LmR
DataSource ds = (DataSource) ctx.lookup(jndi); [!U%''
Connection cn = ds.getConnection(); H%vgPQ8
多用于jsp中 nU=
2、执行sql语句 Lvt3S
.l
1)用Statement来执行sql语句 ok6t|
7sq
String sql; G#Bm">+
Statement sm = cn.createStatement(); :YLs]JI<
sm.executeQuery(sql); // 执行数据查询语句(select) N?c~AEk9U
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); <f
(z\pi1
2)用PreparedStatement来执行sql语句 st??CX2
String sql; n^1BtP0!
sql = "insert into user (id,name) values (?,?)"; q-CgXwU
PreparedStatement ps = cn.prepareStatement(sql); ##By!FTP
ps.setInt(1,xxx); T0A=vh;S
ps.setString(2,xxx); mfj%-)l9
... `i|!wD,=\
ResultSet rs = ps.executeQuery(); // 查询 ")9 ^
int c = ps.executeUpdate(); // 更新 )09ltr0@"
?h1g$SBxk
3、处理执行结果 ~_0XG0oA
查询语句,返回记录集ResultSet 2iKteJ@h)
更新语句,返回数字,表示该更新影响的记录数 E6R\DM
ResultSet的方法 MMO/vJC
1、next(),将游标往后移动一行,如果成功返回true;否则返回false WUauKRR.
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 1Ov oW Nx
\DlMOG
4、释放连接 Cn=#oE8(A
cn.close(); a`:F07r
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection xrXfZ>$5bM
A1;'S<a
可滚动、更新的记录集 7%$3`4i`O
1、创建可滚动、更新的Statement <FR!x#!
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); qYoU\y7
该Statement取得的ResultSet就是可滚动的 o5RvxGN
2、创建PreparedStatement时指定参数 x?rd9c
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); /\qzTo
ResultSet.absolute(9000); .Erv\lv*
批量更新 l?b*T#uIk
1、Statement '_Q';T_n99
Statement sm = cn.createStatement(); IJ5'n
sm.addBatch(sql1); 8 # BR\
sm.addBatch(sql2); D?dS/agA
... Mk9J~'C_
sm.executeBatch() mb`h
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 "*HEXru#B
2、PreparedStatement TPx`qyW
PreparedStatement ps = cn.preparedStatement(sql); R'1j
{ IRR b^Q6
ps.setXXX(1,xxx); E3{kH
7_'\
... H/*slqL
ps.addBatch(); Hi2JG{i
} ^r<l#D,
ps.executeBatch(); &hZ.K"@7{
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 } PL{i
[xb'73
事务的处理 t%,:L.?J#
1、关闭Connection的自动提交 OW6dK#CFt
cn.setAutoCommit(false); ~233{vh$=>
2、执行一系列sql语句 S.>fB7'(?=
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close uMm`j?Y23q
Statement sm ; )l(DtU!E
sm = cn.createStatement(insert into user...); %p7onwKq0
sm.executeUpdate(); |F\fdB}?S:
sm.close(); U:@tdH+A7
sm = cn.createStatement("insert into corp...); N2|NYDQs
sm.executeUpdate(); yXIJeo"
sm.close(); j"Ew)6j
3、提交 00SS<iX
cn.commit(); @K S .H
4、如果发生异常,那么回滚 K[?@nl?,z
cn.rollback();