java 数据库基本操作 |p4D!M+$7
1、java数据库操作基本流程 yf >
rG
2、几个常用的重要技巧: 4Ss4jUj
可滚动、更新的记录集 A_h|f5
批量更新 ld *W\
事务处理 Ge'[AhA
UY(pKe>
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 p$5uS=:4`8
1、取得数据库连接 49('pq?D
1)用DriverManager取数据库连接 Ox | ?
例子 }PC_qQF
String className,url,uid,pwd; 2p^Jqp`$
className = "oracle.jdbc.driver.OracleDriver"; [h5~1N
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Ch] `@(l
uid = "system"; ":qhO0
pwd = "manager"; /$EX-!ie
Class.forName(className); V(lxkEu/Fj
Connection cn = DriverManager.getConnection(url,uid,pwd); k?!CJ@5$
2)用jndi(java的命名和目录服务)方式 OON]E3yy
例子 Z=[qaJ{]
String jndi = "jdbc/db"; Jw+k=>
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); .eBo:4T!d
DataSource ds = (DataSource) ctx.lookup(jndi); 8QJ^@|7
Connection cn = ds.getConnection(); j3-^,r
t4
多用于jsp中 \!51I./Q/
2、执行sql语句 8I>'xf
1)用Statement来执行sql语句 o4.?m6d
String sql; &c AFKYt
Statement sm = cn.createStatement(); {)CN.z:O
sm.executeQuery(sql); // 执行数据查询语句(select) :@~Nszlb
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Wr j<}L|
2)用PreparedStatement来执行sql语句 b41f7t=
String sql; T)Uhp
sql = "insert into user (id,name) values (?,?)"; M?gc&2Y
PreparedStatement ps = cn.prepareStatement(sql); 6_=t~9sY
ps.setInt(1,xxx); C:9a$
ps.setString(2,xxx); C j4ED
... 'NAC4to;;
ResultSet rs = ps.executeQuery(); // 查询 }J ^+66{
int c = ps.executeUpdate(); // 更新 ^~7/hm:
srGF=1_
3、处理执行结果 _{C
=d3
查询语句,返回记录集ResultSet VF bso3q<j
更新语句,返回数字,表示该更新影响的记录数 V[#$Sz[G
ResultSet的方法 3oQ?VP
1、next(),将游标往后移动一行,如果成功返回true;否则返回false [uLpm*7
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 %.rVIc"
Zl\$9Q_
4、释放连接 xf7_|l
cn.close(); xTGdh
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 7Eo;TNbb
PR2;+i3
可滚动、更新的记录集 lD-HQd
1、创建可滚动、更新的Statement VprrklZ
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Q`zW[Y&]
该Statement取得的ResultSet就是可滚动的 (7*((
2、创建PreparedStatement时指定参数 0F-%C>&g
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); DX(!G a
ResultSet.absolute(9000); T1U8ZEK<iu
批量更新 x:E:~h[.^
1、Statement T( z/Jm3
Statement sm = cn.createStatement(); s= bP@[Gj
sm.addBatch(sql1); DyCnL@
sm.addBatch(sql2); ?m\?
#
... wv.HPmq
sm.executeBatch() oU/{<gs
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 1EHL8@.M
2、PreparedStatement DEQ7u`6
PreparedStatement ps = cn.preparedStatement(sql); <3fY,qw
{ 7m.>2U
ps.setXXX(1,xxx); s(8e)0Tl
... m:)sUC0
ps.addBatch(); Xk9 8%gv
} miB+'n"zS
ps.executeBatch(); XR+
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 /2x@Z>
D$fWeG{f
事务的处理 ]-{A"tJ
1、关闭Connection的自动提交 X!|K 4Z!k
cn.setAutoCommit(false); <T`&NA@%~$
2、执行一系列sql语句 I\<)9`O
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close .OZ\s%h;
Statement sm ; ,FK.8c 6g
sm = cn.createStatement(insert into user...); 7qLB 9r
sm.executeUpdate(); z#GrwE,r
sm.close(); >Q2kXwN
sm = cn.createStatement("insert into corp...); giHqc7-PaX
sm.executeUpdate(); <N8z<o4rku
sm.close(); [e7nW9\l
3、提交 o]aMhSol
cn.commit(); UG=],\E2
4、如果发生异常,那么回滚 fS]Z`U"
cn.rollback();