java 数据库基本操作 {CtR+4KD
1、java数据库操作基本流程 rEdY>\'
2、几个常用的重要技巧: `9Yn0B.
可滚动、更新的记录集 (luKn&826
批量更新 w&Y{1r F>
事务处理 .63=(o
3uV4/%U
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 w7FoL
1、取得数据库连接 oKA& An
1)用DriverManager取数据库连接 ^rL_C}YBj-
例子 %y&]'A
String className,url,uid,pwd; <_Eg?ePW#
className = "oracle.jdbc.driver.OracleDriver";
%v+=;jw
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; UL(
lf}M
uid = "system"; j?6X1cM q
pwd = "manager"; 2C$R4:Ssw)
Class.forName(className); Kc #|Z
Connection cn = DriverManager.getConnection(url,uid,pwd); ecj7BT[mLI
2)用jndi(java的命名和目录服务)方式 Dzl;-]S
例子 N2ied^* 0
String jndi = "jdbc/db"; MV0Lq:# N
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); +pf5\#l?
DataSource ds = (DataSource) ctx.lookup(jndi); 7AwgJb hn
Connection cn = ds.getConnection(); x({H{'9?
多用于jsp中 "0CjP+1k
2、执行sql语句 rkB'Hf
1)用Statement来执行sql语句 e$e#NoN
String sql; ";x+1R.d
Statement sm = cn.createStatement(); ['q&@_d7
sm.executeQuery(sql); // 执行数据查询语句(select) c3)C{9T](
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); e)H!uR
2)用PreparedStatement来执行sql语句 }fZ`IOf
String sql; h5"Ov,K3[
sql = "insert into user (id,name) values (?,?)"; +/rH(Ni
PreparedStatement ps = cn.prepareStatement(sql); ,qQG;w,m
ps.setInt(1,xxx); 3GH(wSv9\
ps.setString(2,xxx); k`\R+WK$
... ]ikomCg
ResultSet rs = ps.executeQuery(); // 查询 "Pz}@=
int c = ps.executeUpdate(); // 更新 "5Uh<X
8z2Rry
w
3、处理执行结果 /KCPpERk{
查询语句,返回记录集ResultSet Nc)J18
更新语句,返回数字,表示该更新影响的记录数 6GAaV[])'
ResultSet的方法 n6MM5h/#r
1、next(),将游标往后移动一行,如果成功返回true;否则返回false `_vB+a
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 x%N\5 V1
.fYZ*=P;c
4、释放连接 uH@FU60
cn.close(); _Ov;4nt!
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection t<j^q`;@v
amWD-0V
可滚动、更新的记录集 zR;X*q"T$4
1、创建可滚动、更新的Statement \.uc06
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); w Q+8\ s=
该Statement取得的ResultSet就是可滚动的 Zg~nlO2
2、创建PreparedStatement时指定参数 ]m4OIst
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ({^9<Us
ResultSet.absolute(9000); 2xwlKmI N
批量更新 e@#kRklV&
1、Statement 5J2=`=FK
Statement sm = cn.createStatement(); 1ocJ+
sm.addBatch(sql1); )$Mmn
sm.addBatch(sql2); B,WTHU[AV
... BvD5SBa}"
sm.executeBatch() $wB^R(f@
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 bFS>)
2、PreparedStatement Bux [6O%
PreparedStatement ps = cn.preparedStatement(sql); d[D&J
{ S6d`ioi-
ps.setXXX(1,xxx); kc `V4b%
... uC3:7
ps.addBatch(); SOZPZUUEJ
} errH>D~
ps.executeBatch(); &fC!(Oy
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ao" %WX
BYrZEVM9
事务的处理 :1ecx$
1、关闭Connection的自动提交 !y:%0{l
cn.setAutoCommit(false); @|}BXQNd
2、执行一系列sql语句 |RkcDrB~
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Q/ms]Du
Statement sm ; N6OMYP1
sm = cn.createStatement(insert into user...); /93l74.w
sm.executeUpdate(); wC_l@7t
sm.close(); &MZ$j46
sm = cn.createStatement("insert into corp...); nlYR-.
sm.executeUpdate(); YevyN\,}V!
sm.close(); M:KbD|
3、提交 G!N{NCq
cn.commit(); RyJ 1mAC
4、如果发生异常,那么回滚 A-
YBQPE
cn.rollback();