java 数据库基本操作 L~y t AZ,
1、java数据库操作基本流程 puN=OX}C
2、几个常用的重要技巧: M5WtGIV
可滚动、更新的记录集
/1~|jmi(
批量更新 `(/saq*
事务处理 (0#F]""\e
=4<S8Cp
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 )kKmgtj
1、取得数据库连接 o Xi}@
1)用DriverManager取数据库连接 Du:p!nO
例子 YQV?S
String className,url,uid,pwd; An #Hb=
className = "oracle.jdbc.driver.OracleDriver"; s%[GQQ-N
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; UXPegK!
uid = "system"; Wk#h,p3
pwd = "manager"; E8_Le
Class.forName(className); R{uJczu
Connection cn = DriverManager.getConnection(url,uid,pwd); 4UD=Y?zK
2)用jndi(java的命名和目录服务)方式 U?mf^'RE
例子 a,*p_:~i
String jndi = "jdbc/db"; %m{.l4/!O
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 1"&;1Ts
DataSource ds = (DataSource) ctx.lookup(jndi); D?yE$_3>c
Connection cn = ds.getConnection(); H9VXsFTW
多用于jsp中 |\|)j>[i
2、执行sql语句 b>=Wq
1)用Statement来执行sql语句 >q@Sd
String sql; MiH}VfI
Statement sm = cn.createStatement(); 6w"( y~c1
sm.executeQuery(sql); // 执行数据查询语句(select) @D~+D@i$TW
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); bLEATT[
2)用PreparedStatement来执行sql语句 _gm?FxV:
String sql; n<<=sj$\!
sql = "insert into user (id,name) values (?,?)"; $@_t5?n``F
PreparedStatement ps = cn.prepareStatement(sql); <2O7R}j7v
ps.setInt(1,xxx); KBw9(
ps.setString(2,xxx); r<X 4ER
... %aH$Tb%`hc
ResultSet rs = ps.executeQuery(); // 查询 guOSO@
int c = ps.executeUpdate(); // 更新 Kka8cG
,{{#a*nd
3、处理执行结果 QhXC>)PW
查询语句,返回记录集ResultSet H8$<HhuZM
更新语句,返回数字,表示该更新影响的记录数 S1^nC tSF
ResultSet的方法 /ggkb8<3
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Bug}^t{M
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 YYE8/\+B.
Z@,PZ
4、释放连接 WVWS7N\
cn.close(); w^])(
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection qfGtUkSSb
6`qr:.
可滚动、更新的记录集 Q:kVCm/;
1、创建可滚动、更新的Statement i&pJg1
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 6b]1d04hT
该Statement取得的ResultSet就是可滚动的 ZEj!jWP2m
2、创建PreparedStatement时指定参数 /MKNv'5&!%
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 0SMQDs5j
ResultSet.absolute(9000); w3=)S\
批量更新 FL`1yD^2
1、Statement Xqg.kX
Statement sm = cn.createStatement(); (D>y6r>r
sm.addBatch(sql1); XpgV09.EE
sm.addBatch(sql2); | 7 m5P@X
... _}zo
/kDA
sm.executeBatch() z$c&=Q
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 gX$0[
sIS.
2、PreparedStatement p,w|=@=
PreparedStatement ps = cn.preparedStatement(sql); c.(Ud`jc
{ ZD)0P=%
ps.setXXX(1,xxx); 6Q2orn[
... ,2,SG/BB
ps.addBatch(); XLZ j
} B:?#l=FL
ps.executeBatch(); df4sOqU
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 U=F-]lD
CZJHE>
事务的处理 BbrT f"`
1、关闭Connection的自动提交 Y9i9Uc.]
cn.setAutoCommit(false); Nmp>UE,7[
2、执行一系列sql语句 -@ZzG uS(
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close )X~Pr?52?
Statement sm ; =a)iVXSB]
sm = cn.createStatement(insert into user...); I z}2
^
sm.executeUpdate(); +urS5c*
j
sm.close(); 2cCWQ"_,
sm = cn.createStatement("insert into corp...); /v"6BU
sm.executeUpdate(); ls"b#eFC#
sm.close(); %2Epgh4?
3、提交 5pRY&6So
cn.commit(); ua`6M
4、如果发生异常,那么回滚 l:Dn3Q
cn.rollback();