java 数据库基本操作 'QeCJ5p]
1、java数据库操作基本流程 T2Ms/1FH/@
2、几个常用的重要技巧: &,JrhMr\
可滚动、更新的记录集
W0R<^5_
批量更新 ..)O/g.
事务处理 aHuZzYQ*"j
K!=Y4"5%
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 33:{IV;k
1、取得数据库连接 g\ilK:r}
1)用DriverManager取数据库连接 Gx,<|v
例子 4l_!OUvt
String className,url,uid,pwd; )7f;FWI
className = "oracle.jdbc.driver.OracleDriver"; F-D9nI4{X
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; At3>
uid = "system"; Psm5J80}n
pwd = "manager"; 4,4S5u[|
Class.forName(className); }%x2Z{VF
Connection cn = DriverManager.getConnection(url,uid,pwd); I!Z=3 $,
2)用jndi(java的命名和目录服务)方式 R6v~Sy&n!
例子 1P;J%.{
String jndi = "jdbc/db"; /g(WCKva
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ps[HvV"
DataSource ds = (DataSource) ctx.lookup(jndi); "}fJ 2G3
Connection cn = ds.getConnection(); :qy< G!o
多用于jsp中 Qqm'Yom%T
2、执行sql语句 rom`%qp^
1)用Statement来执行sql语句 +#ufW%ZG
String sql; "MM)AY*b
Statement sm = cn.createStatement(); <A@}C+
sm.executeQuery(sql); // 执行数据查询语句(select) !8~A`
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); .FYxVF.
2)用PreparedStatement来执行sql语句 >BFUts%
String sql; }$
C;ccWL
sql = "insert into user (id,name) values (?,?)"; Kg?(Ax4
PreparedStatement ps = cn.prepareStatement(sql); "Te[R%aP
ps.setInt(1,xxx); w=JO$7
ps.setString(2,xxx); K@U[x,Sx
... w>S;}[fM
ResultSet rs = ps.executeQuery(); // 查询 f"9aL= 3
int c = ps.executeUpdate(); // 更新 2PZ#w(An&
tx`gXtO$
3、处理执行结果 5NGQWg
查询语句,返回记录集ResultSet X/Sp!W-H
更新语句,返回数字,表示该更新影响的记录数 [L(qrAQ2|z
ResultSet的方法 ^`iqa-1
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ^jhc(ZW"
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 GW{e"b/x
g&&-
4、释放连接 uE E;~`G
cn.close();
ERTjY%A
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection }B1f_T
D`c&Q4$:
可滚动、更新的记录集 t9l]ie{"o.
1、创建可滚动、更新的Statement $Iz *W]B!
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 9t8NK{
该Statement取得的ResultSet就是可滚动的 uSQlE=
2、创建PreparedStatement时指定参数 -qyhg-k6
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); G'#Uzwo
ResultSet.absolute(9000); db*yA@2Lg
批量更新 ExKyjWAJ
1、Statement u0;k_6N
Statement sm = cn.createStatement(); Nhf@Y}Cu
sm.addBatch(sql1); e92,@
sm.addBatch(sql2); 2y`X)
... KwAc Ga}J
sm.executeBatch() pGRk
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 aoUz_7
2、PreparedStatement 3kzO
VZ
PreparedStatement ps = cn.preparedStatement(sql); .RW&=1D6
{ *(g0{V
ps.setXXX(1,xxx); eL" +_lW
... 3QhQpPk),
ps.addBatch(); k^@dDLr"
} #IvHxSo&
ps.executeBatch(); .~O-
<P#
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 A'6-E{
"UYlC0 S\
事务的处理 HkPdqNC&
1、关闭Connection的自动提交 n:"0mWnL$y
cn.setAutoCommit(false); !-HJ%(5:F
2、执行一系列sql语句
i"`N5
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close :lU#Dm]
Statement sm ; "W^+NeLc
sm = cn.createStatement(insert into user...); w<LV5w+
sm.executeUpdate(); X<sM4dwxE
sm.close(); 6c6w w"
sm = cn.createStatement("insert into corp...); LK|1[y^h
sm.executeUpdate(); W:VX^8</
sm.close(); =Jax T90x
3、提交 {zIcEN$ ~
cn.commit(); y$8S+N?>
4、如果发生异常,那么回滚 kD46Le++B
cn.rollback();