java 数据库基本操作 6"o@d8>v
1、java数据库操作基本流程 o{MmW~/o&
2、几个常用的重要技巧: g+ cH
可滚动、更新的记录集 SiT5QJe
批量更新 J~5+=V7OV
事务处理 |+aD%'|
D{]9s
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 xcXnd"YYE
1、取得数据库连接 9P-I)ZqL
1)用DriverManager取数据库连接 kO8oH8Vt
例子 2D{`AJ
String className,url,uid,pwd; Y:5Gp8Vi
className = "oracle.jdbc.driver.OracleDriver"; ,k6V?{ZA
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; #Gu(h(Z s
uid = "system"; vsbD>`I
pwd = "manager"; -+ Mh('K
Class.forName(className); ~" U^N:I"
Connection cn = DriverManager.getConnection(url,uid,pwd); (=QiXX1r
2)用jndi(java的命名和目录服务)方式 G-RE
例子 t",b.vki\z
String jndi = "jdbc/db"; {pk&dB _Bu
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 22v=
A6 =
DataSource ds = (DataSource) ctx.lookup(jndi); x^!LA,`j
Connection cn = ds.getConnection(); udX!R^8jE
多用于jsp中 O['5/:-
2、执行sql语句 'X1/tB8*
1)用Statement来执行sql语句 qyY]:
(8
String sql; Q|W~6
Statement sm = cn.createStatement(); RjG=RfB'V
sm.executeQuery(sql); // 执行数据查询语句(select) /8s>JPXKH[
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); KA]5tVQA
2)用PreparedStatement来执行sql语句 :stA]JB#
w
String sql; ]iH~1 [
sql = "insert into user (id,name) values (?,?)"; d)v'K5
PreparedStatement ps = cn.prepareStatement(sql); :.F;LF&
ps.setInt(1,xxx); XbW 1`PH
ps.setString(2,xxx); -F';1D!l%
... bBXUD;$
ResultSet rs = ps.executeQuery(); // 查询 2@$`xPg
int c = ps.executeUpdate(); // 更新 r[kmgPld
3rVWehCv
3、处理执行结果 kntn9G
查询语句,返回记录集ResultSet _{0IX
更新语句,返回数字,表示该更新影响的记录数 %9`\7h7K
ResultSet的方法 7!#34ue
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Y-:dPc{
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 v\Xyz
)
@"BkLF
4、释放连接 OC_i,
cn.close(); r>7Dg~)V
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection "P8cgj C
]dQ
可滚动、更新的记录集 -jL10~/
1、创建可滚动、更新的Statement PRyzUG&
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY);
xSZ+6R|
该Statement取得的ResultSet就是可滚动的 ?H(']3X5@
2、创建PreparedStatement时指定参数 eih~ SBSH
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ?89_2W
ResultSet.absolute(9000); ynG@/S6)K
批量更新 Mp`i@pm+
1、Statement [[vb w)u
Statement sm = cn.createStatement(); fk?(mxx"
sm.addBatch(sql1); !1ZrS
sm.addBatch(sql2); B-EDVMu
... Vi\kB%
sm.executeBatch() ./E<v
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 u75(\<{
2、PreparedStatement >iFi~)i_4y
PreparedStatement ps = cn.preparedStatement(sql); `ouCQ]tKz
{ :,FI 6`
ps.setXXX(1,xxx); y>_*}>2 ,O
... $Rv(v%
ps.addBatch(); y,vrMWDy
} qb7ur;
ps.executeBatch(); E0<$zP}V}F
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 QB#rf='
e6hfgVN
事务的处理 jij-pDQnv
1、关闭Connection的自动提交 C(lGW,!
cn.setAutoCommit(false); "}jv5j5
2、执行一系列sql语句 lc\f6J>HT
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close nM6/c
Statement sm ; ;\)N7SJ
sm = cn.createStatement(insert into user...); E|hW{ oX3
sm.executeUpdate(); ""u>5f
sm.close(); gC\^"m
sm = cn.createStatement("insert into corp...); 0N4+6k|
sm.executeUpdate(); m<| *
sm.close(); y?yWM8
3、提交 G7d)X^q!xS
cn.commit(); KPMId`kf
4、如果发生异常,那么回滚 cuo'V*nWQ
cn.rollback();