java 数据库基本操作 qGG
1、java数据库操作基本流程 W70J2
2、几个常用的重要技巧: R=ddQ:W6g
可滚动、更新的记录集 P~nI6/r1
批量更新 ]eA<
事务处理 (XYYbP
P7r?rbO"
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 `c@KlL*!Q
1、取得数据库连接 ^/`:o}7K7
1)用DriverManager取数据库连接 [OFg
(R-
例子 ~@=:I
String className,url,uid,pwd; 5fi6>>
className = "oracle.jdbc.driver.OracleDriver"; e;8>/G
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ;EstUs3
uid = "system"; ;}),6R
pwd = "manager"; yP2[!vYw
Class.forName(className); %m[
:},
Connection cn = DriverManager.getConnection(url,uid,pwd); J0xOB;rd
2)用jndi(java的命名和目录服务)方式 _urv
We
例子 N\b%+vR
String jndi = "jdbc/db"; [AE-~+m)^
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ypEcjVPD
DataSource ds = (DataSource) ctx.lookup(jndi); >Ya+#j~CZ
Connection cn = ds.getConnection(); hU=n>g>nx
多用于jsp中 /C"dwh"``
2、执行sql语句 T)Z2=5V
1)用Statement来执行sql语句 9u<4Q_I`
String sql; =)5eui>{
Statement sm = cn.createStatement(); XE);oL2xP
sm.executeQuery(sql); // 执行数据查询语句(select) ^yDCX
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close();
>QRpRHtb
2)用PreparedStatement来执行sql语句 5_";EED
String sql; Kd}cf0
sql = "insert into user (id,name) values (?,?)"; J \U}U'qP
PreparedStatement ps = cn.prepareStatement(sql); \[&`PD
ps.setInt(1,xxx); ^S!^$d*
ps.setString(2,xxx); sl^i%xJ|l'
... ~5$V8yfx h
ResultSet rs = ps.executeQuery(); // 查询 )qs>Z?7
int c = ps.executeUpdate(); // 更新 X~XpX7d!
W j2]1A
3、处理执行结果 Z\8TpwD2
查询语句,返回记录集ResultSet -E~pCN(E
更新语句,返回数字,表示该更新影响的记录数 a>A29*q
ResultSet的方法 F-Mf~+=Dn
1、next(),将游标往后移动一行,如果成功返回true;否则返回false B:qH7`s
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 HrQBzS
\YO1 ;\W
4、释放连接 j48cI3C
cn.close(); hEAt4z0P
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection [su2kOX|X
%!$ua_8
可滚动、更新的记录集 4eapR|#T
1、创建可滚动、更新的Statement [f["9(:
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); c;DWSgIw
该Statement取得的ResultSet就是可滚动的 A,-UW+:
2、创建PreparedStatement时指定参数 ZY-UQ4_|u
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); O--
"\4
ResultSet.absolute(9000); aWhhq@
批量更新 s6SG%Vd
1、Statement gaBt;@?:Q
Statement sm = cn.createStatement(); -;=0dfC(
sm.addBatch(sql1); b0PqP<{ t
sm.addBatch(sql2); \/,54c2
... Q" BIk
=
sm.executeBatch() v3
4!rL
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 7eb^^a?
2、PreparedStatement %g7 !4
PreparedStatement ps = cn.preparedStatement(sql); /h'V1zL#
{ k&|L"N|w
ps.setXXX(1,xxx); H%NP4pK
... B$A`-
ps.addBatch(); Lf _`8Ux
} 8_0j^oh
ps.executeBatch(); wN/d
J
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 CuRYtY@9
TR3_!0
事务的处理 hX4&B
1、关闭Connection的自动提交 ^n#6CW*n
cn.setAutoCommit(false); `Q?rQ3A}
2、执行一系列sql语句 S'T&`"Mr
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Cv{>|g#
Statement sm ; 0g% `L_e_
sm = cn.createStatement(insert into user...); tqyR~
sm.executeUpdate(); Zh. 5\&bm
sm.close(); '5zolp%St
sm = cn.createStatement("insert into corp...); IB#L5yN r
sm.executeUpdate(); fR<_ 4L
sm.close(); >?K@zsv}
3、提交 F VBuCi?W
cn.commit(); ("UcjB^62
4、如果发生异常,那么回滚 "w]
Bq0
cn.rollback();