java 数据库基本操作 %L|xmx!c
1、java数据库操作基本流程 'T|EwrS j
2、几个常用的重要技巧: 1l'JoU.<
可滚动、更新的记录集 tVe =c
批量更新 I.'/!11>
事务处理 >WA'/Sl<A<
m1e Sn |)7
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 )<f4F!?,A
1、取得数据库连接 ["#H/L]3
1)用DriverManager取数据库连接 X`(fJ',
例子 Om*(dK]zHQ
String className,url,uid,pwd; c*y*UG
className = "oracle.jdbc.driver.OracleDriver"; D4N(FZ0~
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 73_=CP"t
uid = "system"; .EReYZO
pwd = "manager"; (hBph+
Class.forName(className); o`Af6C;Q
Connection cn = DriverManager.getConnection(url,uid,pwd); )MF 4b][
2)用jndi(java的命名和目录服务)方式 :-WNw
n
例子 *b_Iby-ZD
String jndi = "jdbc/db"; }4T `)
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 3B='f"G
DataSource ds = (DataSource) ctx.lookup(jndi); ))dw[Xa
Connection cn = ds.getConnection(); 1G6 \}El95
多用于jsp中
ilXKJJda
2、执行sql语句 Ai"MJ6)
1)用Statement来执行sql语句 qW4DW4
String sql; +\*b?x
Statement sm = cn.createStatement(); :7i x`C2
sm.executeQuery(sql); // 执行数据查询语句(select) RU=\eD
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); nLOK1@,4
2)用PreparedStatement来执行sql语句 X`3_ yeQc
String sql; 5NC77}^.
sql = "insert into user (id,name) values (?,?)"; PJ4/E
PreparedStatement ps = cn.prepareStatement(sql); 3:G$Y:#P
ps.setInt(1,xxx); ,6X__Z#rGT
ps.setString(2,xxx); NJSbS<O
... mK/E1a)AG3
ResultSet rs = ps.executeQuery(); // 查询 ?lfyC/
int c = ps.executeUpdate(); // 更新
iDx(qdla
3d]~e
3、处理执行结果 %wXjP`#
查询语句,返回记录集ResultSet lU%oU&P/"S
更新语句,返回数字,表示该更新影响的记录数 TFm[sO0RZ
ResultSet的方法 =1k%T {>
1、next(),将游标往后移动一行,如果成功返回true;否则返回false [y}h
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 j{'_sI{{
en/ h`h]h
4、释放连接 g\?v 5
cn.close(); /CH]'u^j
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection a0+q^*\d\R
?A3u2-
可滚动、更新的记录集 o>nw~_ H\
1、创建可滚动、更新的Statement /E2P
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY);
4JU 2x
该Statement取得的ResultSet就是可滚动的 Zoc4@%
n
2、创建PreparedStatement时指定参数 YXZP-=fB>i
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); QVJpX;u
ResultSet.absolute(9000); cWG%>.`5r
批量更新 d"IZt;s/,
1、Statement H2H[ DVKv
Statement sm = cn.createStatement(); 10h;N[
sm.addBatch(sql1); z5oJQPPi
sm.addBatch(sql2); \NMqlxp2
... 0%<
hj
sm.executeBatch() G3`9'-2q@c
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 .%)uCLZr$
2、PreparedStatement x/CM)!U)
PreparedStatement ps = cn.preparedStatement(sql); hJ]Oa7r
{ 7y3WV95Z\
ps.setXXX(1,xxx); =.CiKV$E
... maDWV&Db
ps.addBatch(); |pv$],&&:
} gKl9Nkd!R
ps.executeBatch(); Sgv_YoD?-
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 i-w$-2w
S9r?= K
事务的处理 VBix8|
1、关闭Connection的自动提交 I |c!:4
cn.setAutoCommit(false); Xp9I3nd|
2、执行一系列sql语句 )XavhS~Ff
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close NJE*/_S
Statement sm ; EPH
n"YK
sm = cn.createStatement(insert into user...); +or<(%o @
sm.executeUpdate(); OJ"./*H
sm.close(); e ><0crb
sm = cn.createStatement("insert into corp...); 7l$
u.[
sm.executeUpdate(); :N _]*>
sm.close(); >qOG^{&x
3、提交 j`"!G*Vh
cn.commit(); ,mHUo4h1O
4、如果发生异常,那么回滚 8C8S)
;
cn.rollback();