java 数据库基本操作 |sMRIW,P
1、java数据库操作基本流程 Zk__CgS#
2、几个常用的重要技巧: =21$U[
可滚动、更新的记录集 |Nd!+zE$Z
批量更新 qxf!]jm
事务处理 EeG7 %S
5(
& V^Z
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 H)}>&Z4
1、取得数据库连接 cKdn3 2Y4
1)用DriverManager取数据库连接 rE;*MqYt&
例子 yhJH3<
String className,url,uid,pwd; v{Al>v}}n
className = "oracle.jdbc.driver.OracleDriver"; O
$'#8
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 9cp-Rw<tI
uid = "system"; Urj8v2k
pwd = "manager"; I?uU}NK
Class.forName(className); %%)"W
n#`
Connection cn = DriverManager.getConnection(url,uid,pwd); >0DQ<@ot:
2)用jndi(java的命名和目录服务)方式 t, #7F$t
例子 I'HPy.PV
String jndi = "jdbc/db"; Zy|B~.@<j
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); C$(US8:{
DataSource ds = (DataSource) ctx.lookup(jndi); #3>o^cN~8k
Connection cn = ds.getConnection(); Qn(2UO!pD
多用于jsp中 9Bvi2
3
2、执行sql语句 F&%@p&
1)用Statement来执行sql语句 ztTj2M"
String sql;
]W~\%`#8?
Statement sm = cn.createStatement(); :JH#*5%gQ:
sm.executeQuery(sql); // 执行数据查询语句(select) de1cl<
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Ckd@|
2)用PreparedStatement来执行sql语句 7DDd1"jE
String sql; W@`2+}
sql = "insert into user (id,name) values (?,?)"; {^=T&aCYdS
PreparedStatement ps = cn.prepareStatement(sql); "s]r"(MX
ps.setInt(1,xxx); T\I}s"d
ps.setString(2,xxx); XLb
lVi@
... g>-pC a
ResultSet rs = ps.executeQuery(); // 查询 3O7]~5 j1
int c = ps.executeUpdate(); // 更新 pYf57u
Q)c3=.[>
3、处理执行结果 g = ~Y\$&
查询语句,返回记录集ResultSet U$v|c%6
更新语句,返回数字,表示该更新影响的记录数 `-W.uOZ0
ResultSet的方法 SK
[1h3d
1、next(),将游标往后移动一行,如果成功返回true;否则返回false `)%z k W
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 r+n0M';0
S"'0lS
4、释放连接 @&?E3?5ll
cn.close(); `|coA2$rw
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection u^|c_5J(
,%"!8T
可滚动、更新的记录集 JJ_b{ao<
1、创建可滚动、更新的Statement 94VtGg=b}
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); WJWi'|C4
该Statement取得的ResultSet就是可滚动的 k-IL%+U
2、创建PreparedStatement时指定参数 ve($l"T
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ${m;x: '
ResultSet.absolute(9000); V5:ad
批量更新 (StX1g'
1、Statement OL]P(HRm]~
Statement sm = cn.createStatement(); EQI9J#;+
sm.addBatch(sql1); 01=nS?
sm.addBatch(sql2); M.fAFL
... scX'>\w&c
sm.executeBatch() g>G+?PY
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 m}A| W[p<
2、PreparedStatement 9d&@;&al
PreparedStatement ps = cn.preparedStatement(sql); ^POHQQ
{ V %h,JA
ps.setXXX(1,xxx); p0*qv"lA
... 2[|52+zhc
ps.addBatch(); =mR~\R(
I
} }`KK
ps.executeBatch(); )X
|[jP
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 '8%jA$o\g
;)~}/nR<a
事务的处理 =LXjq~p
1、关闭Connection的自动提交 YP
E1s
cn.setAutoCommit(false); "5<:Dj/W
2、执行一系列sql语句 (
jAC Lo
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close P5Lb)9_Jw
Statement sm ; Zt_~Zxn3
sm = cn.createStatement(insert into user...); 0JFS%Yjw[
sm.executeUpdate(); "s-3226kj
sm.close(); X*cDn.(I
sm = cn.createStatement("insert into corp...); 6/Iq@BZ&
sm.executeUpdate(); 0N;~(Vt2
sm.close(); Z(j"\d!y
3、提交 )
>;7"v
cn.commit();
I~T
4、如果发生异常,那么回滚 IiU\}<O
cn.rollback();