java 数据库基本操作 w+TuS).
1、java数据库操作基本流程 ra#)*fG,~
2、几个常用的重要技巧: {*P7)
可滚动、更新的记录集 9(gOk
批量更新 !urd
$Ta
事务处理 T%vbD*nt.
Ku\#Wj|YrP
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 J+*Y)k
1、取得数据库连接 ^*~u4app
1)用DriverManager取数据库连接 _EBDv0s
例子 lkJ#$Ik&
String className,url,uid,pwd; Vy"^]5
className = "oracle.jdbc.driver.OracleDriver"; !(AFT!
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; MvwJ(3
uid = "system"; K OHH74}_
pwd = "manager"; s 17gi,"X
Class.forName(className);
K`Zb;R
X
Connection cn = DriverManager.getConnection(url,uid,pwd); YVV $g-D}
2)用jndi(java的命名和目录服务)方式
NGD2z.
例子 745V!#3!M
String jndi = "jdbc/db"; RloPP
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 03jBN2[!
DataSource ds = (DataSource) ctx.lookup(jndi); 5|={1Lp24g
Connection cn = ds.getConnection(); 0'2{[xF
多用于jsp中 X{5 DPhB,
2、执行sql语句 0r&9AnnWu+
1)用Statement来执行sql语句 +s 0Bt '
String sql; |>V>6%>vK6
Statement sm = cn.createStatement(); J0z0%p
sm.executeQuery(sql); // 执行数据查询语句(select) 6_
0w>
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); y:Ab5/bHy
2)用PreparedStatement来执行sql语句 ,TA[el%#
String sql; xE[tD? M{
sql = "insert into user (id,name) values (?,?)"; 1:Gd{z
PreparedStatement ps = cn.prepareStatement(sql); H ?:#Ui(p
ps.setInt(1,xxx); ]ZATER)jq
ps.setString(2,xxx); 90v18k
... O
lIH0
ResultSet rs = ps.executeQuery(); // 查询 6df&B
.gg
int c = ps.executeUpdate(); // 更新 f__WnW5h
'GoeVq
3、处理执行结果 *N+aZV}`Z
查询语句,返回记录集ResultSet q%&7J<
更新语句,返回数字,表示该更新影响的记录数 _cs9R%
ResultSet的方法 \r9%;?f
1、next(),将游标往后移动一行,如果成功返回true;否则返回false QQ8W;x
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 b:&$x (|
V1U[p3J-S
4、释放连接 p&27|1pZm
cn.close(); ?b$zuJ]
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection BC[d={_-
pU'sADC
可滚动、更新的记录集 ^( VB5p
1、创建可滚动、更新的Statement
aj B
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ',%&DA2
该Statement取得的ResultSet就是可滚动的 T#f@8 -XUE
2、创建PreparedStatement时指定参数 LP_F"?4
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); @]3Rw[%z
ResultSet.absolute(9000); e)(|
批量更新 J8DbAB4X
1、Statement 8dB~09Z7
Statement sm = cn.createStatement(); F}[;ytmUS
sm.addBatch(sql1); 0)44*T
sm.addBatch(sql2); K0@7/*%
... Br!&Y9
sm.executeBatch() X*q
C:]e
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 R/YL1s
2、PreparedStatement 3?(p;
PreparedStatement ps = cn.preparedStatement(sql); !AHm+C_=Lg
{ _q$fw&
ps.setXXX(1,xxx); .?j8{>
... O{R5<"g
ps.addBatch(); jG :R\D}0
} FI5C&d5d
ps.executeBatch(); ?R} oXSVT
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 s~w+bwr
L,/i%-J3c
事务的处理 C^tC} n1D(
1、关闭Connection的自动提交 _4]dPk#^
cn.setAutoCommit(false); l
d9#4D[#
2、执行一系列sql语句 pwC/&bu
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close l[| e3<H
Statement sm ; mjHY-lK
sm = cn.createStatement(insert into user...); [DEw:%
sm.executeUpdate(); m m`3-F|
sm.close(); A6L}5#7-
sm = cn.createStatement("insert into corp...); [40 YoVlfM
sm.executeUpdate(); QD~`UJe>
sm.close(); YPEd
XU8}
3、提交 U:e9Vq'N m
cn.commit(); b2%[9)"I.
4、如果发生异常,那么回滚 !:e
qPpz
cn.rollback();