java 数据库基本操作 d2C[wQF
1、java数据库操作基本流程 FDF3zzP0
2、几个常用的重要技巧: ]27>a"p59Y
可滚动、更新的记录集 s;B
j7]
批量更新 @V* ju
事务处理 q GpP,
z^gQ\\,4
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 }osHA`x"2
1、取得数据库连接 5JBB+g
1)用DriverManager取数据库连接 t} *l?$`
例子 ),cQUB
String className,url,uid,pwd; gp~yt0AU
className = "oracle.jdbc.driver.OracleDriver"; @-wNrW$
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; $ \Q<K@{
uid = "system"; ku/\16E/k
pwd = "manager"; pqyWv;
Class.forName(className); k^H0b\hYY
Connection cn = DriverManager.getConnection(url,uid,pwd); zmrQf/y{R
2)用jndi(java的命名和目录服务)方式 MV"E?}0
例子 8hTR*e!+
String jndi = "jdbc/db"; )-bD2YA{
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); %`xV'2H
DataSource ds = (DataSource) ctx.lookup(jndi); %f3c7\=C
Connection cn = ds.getConnection(); )KSisEL
多用于jsp中
#4vV%S
2、执行sql语句 K0tV'Ml#"
1)用Statement来执行sql语句 :3f-9aRC!
String sql; 8weSrm
Statement sm = cn.createStatement(); WGH%92
sm.executeQuery(sql); // 执行数据查询语句(select) ,>D ja59
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); zP_ ]
2)用PreparedStatement来执行sql语句 cC^W2\
String sql; kCj`V2go
sql = "insert into user (id,name) values (?,?)"; H@K#|A=a
PreparedStatement ps = cn.prepareStatement(sql); ?qju
DD
ps.setInt(1,xxx); _Zh2eXWdjM
ps.setString(2,xxx); Oo FgQEr@
... FoE|Js
ResultSet rs = ps.executeQuery(); // 查询 Z;ZuS[ZA
int c = ps.executeUpdate(); // 更新 JZ `>|<W
3(1]FKZtt
3、处理执行结果 *6:v}#b[
查询语句,返回记录集ResultSet dZPW2yf
更新语句,返回数字,表示该更新影响的记录数 qs=Gj?GwGQ
ResultSet的方法 >BBl7
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Fj
S%n$
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 z8IPhE@
he"L*p*H
4、释放连接 8EOh0gk7
cn.close(); \Ke8W,)ew
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection b`$yqi<[
%B@!
可滚动、更新的记录集 <>%,}j
9
1、创建可滚动、更新的Statement &,J*_F<s2<
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY);
Do|]eD
该Statement取得的ResultSet就是可滚动的 hw;0t,1
2、创建PreparedStatement时指定参数 X:>$8 ^gS
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); JjQ8|En
ResultSet.absolute(9000); _IWxYp
批量更新 F9-[%l
1、Statement <0#^7Z
Statement sm = cn.createStatement(); [!EXMpq'
sm.addBatch(sql1); :Zza)>l
sm.addBatch(sql2); 2UiR~P]%
... {;*}WPYb
sm.executeBatch() ylu2R0] (
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 5k]XQxc6_
2、PreparedStatement o]<jZ_|gB
PreparedStatement ps = cn.preparedStatement(sql); +td<{4oq8
{ C}q>YRubZ
ps.setXXX(1,xxx); C6|(ktt
... joqWh!kv7U
ps.addBatch(); B@ {&<
} []zua14F6
ps.executeBatch(); Y6A;AmM8
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Z0$] tS
i\)3l%AK]T
事务的处理 u^=`%)
1、关闭Connection的自动提交 ;FU|7L$H
cn.setAutoCommit(false); kx:jI^
2、执行一系列sql语句 /;Yy@oc
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close }x:0os
Statement sm ; \:Za[6
sm = cn.createStatement(insert into user...); h./P\eDc
sm.executeUpdate(); eCWPhB6l
sm.close(); XV>@B $hu
sm = cn.createStatement("insert into corp...); Ow@v"L;jF!
sm.executeUpdate(); 9cG<hX9`F
sm.close(); )T1iN(Z
3、提交 yS!(Ap
cn.commit(); &$=! dA
4、如果发生异常,那么回滚 _7"5wB?|+
cn.rollback();