java 数据库基本操作 uLljM{I
1、java数据库操作基本流程 G{~p.?f:
2、几个常用的重要技巧: ooSd6;'
可滚动、更新的记录集 Dt.Wb&V_w
批量更新 /nFw
事务处理 X)OP316yx
Qu _T&
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 <1BK5%?
1、取得数据库连接 o7XRa]O
1)用DriverManager取数据库连接 #UD
例子 DG?\6Zh
String className,url,uid,pwd; TWEqv<c
className = "oracle.jdbc.driver.OracleDriver"; ;@
X
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Ue:T3jp3%
uid = "system"; )`7+o9&
pwd = "manager"; {fv8S;|u
Class.forName(className); oZ:F3 GQ4Q
Connection cn = DriverManager.getConnection(url,uid,pwd); ueBoSZRWX
2)用jndi(java的命名和目录服务)方式 4>C=:w
例子 E}/|Lja
String jndi = "jdbc/db"; }{oBKm9_p
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); RgA4@J#
DataSource ds = (DataSource) ctx.lookup(jndi); jgw'MpQm{
Connection cn = ds.getConnection(); 0\nhg5]?
多用于jsp中 5yi q#
2、执行sql语句 .@-]A
1)用Statement来执行sql语句 SkRQFm0a~
String sql; m(:qZW
Statement sm = cn.createStatement(); Ec*7n6~9
sm.executeQuery(sql); // 执行数据查询语句(select) M~F2cXW
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); SfSEA^@|
2)用PreparedStatement来执行sql语句 /
i2-h
String sql; u>6/_^iq
sql = "insert into user (id,name) values (?,?)"; F5[ITK]A4
PreparedStatement ps = cn.prepareStatement(sql); `Kw8rG\]:
ps.setInt(1,xxx); RmV/wY
ps.setString(2,xxx); D@W3;T^
... nvVsO>2{ o
ResultSet rs = ps.executeQuery(); // 查询 3#9r4;&
int c = ps.executeUpdate(); // 更新 TbAdTmW
XPo'iI-
3、处理执行结果 .OS?^\
查询语句,返回记录集ResultSet )}\@BtcjA]
更新语句,返回数字,表示该更新影响的记录数 /~cL L
ResultSet的方法 VhI IW"1
1、next(),将游标往后移动一行,如果成功返回true;否则返回false E(+wl
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 -0WCwv
"sX?wTag
4、释放连接 SJ7=<y}[d
cn.close(); >1pH 91c'
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ={@ @`yP^$
@<yc .>
可滚动、更新的记录集 :wmf{c
1、创建可滚动、更新的Statement 6ilC#yyp
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ]J=)pDrk
该Statement取得的ResultSet就是可滚动的 /1#Q=T
2、创建PreparedStatement时指定参数 L9?/ -@M
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 2X c
ResultSet.absolute(9000); `4$Qv'X*
批量更新 ":^
NLBm>5
1、Statement i3&B%JiLX
Statement sm = cn.createStatement(); B5H&DqWzr
sm.addBatch(sql1); 1\{U<Oli
sm.addBatch(sql2); AaC1||?R
... =&:f+!1$
sm.executeBatch() IBNQmVRrI
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 _JIUds5
2、PreparedStatement $SGA60q
PreparedStatement ps = cn.preparedStatement(sql); lrX0c$)
{ lF"(|n"R
ps.setXXX(1,xxx); G$|;~'E
... UQ?OD~7
ps.addBatch(); [67E5rk-
} 6 %k+0\d
ps.executeBatch(); SLjf<.S
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 x`6^+>y^
v;}`?@G
事务的处理 c^bk:=uj
1、关闭Connection的自动提交 H?(SSL
cn.setAutoCommit(false); KPd C9H
2、执行一系列sql语句 "zIq)PY
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close KW7?: x
Statement sm ; ZMMo6;
sm = cn.createStatement(insert into user...); .A!0.M|
sm.executeUpdate(); ZWhmO=b!
sm.close(); ytV)!xe
sm = cn.createStatement("insert into corp...); qM!f
sm.executeUpdate(); xm,`4WdG
sm.close(); ~& WN)r'4y
3、提交 eGSp(o5 6
cn.commit(); Z*9]:dG:!
4、如果发生异常,那么回滚 :Ip:sRz
cn.rollback();