java 数据库基本操作 @ZcI]G%
1、java数据库操作基本流程 \Fu(IuD
2、几个常用的重要技巧: O%Qz6R
可滚动、更新的记录集 SQJ4}w>i
批量更新 #*}cc
事务处理 rFto1m
miY=xwK&
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 EDA6b]
1、取得数据库连接 b|Eo\l2
1)用DriverManager取数据库连接 3E8 Gh>J_
例子 :&s8G*
String className,url,uid,pwd; (T.g""N~`
className = "oracle.jdbc.driver.OracleDriver"; ^3Z~RK\}
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; [?)He} _L
uid = "system"; X>MDX.Z
pwd = "manager"; 70nBC
Class.forName(className); 2j[;M-3
Connection cn = DriverManager.getConnection(url,uid,pwd); 2(Nf$?U@0
2)用jndi(java的命名和目录服务)方式 ;^8X(R
例子 ,B,0o*qc{K
String jndi = "jdbc/db"; BR~+CBH
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); asYUb&Hz88
DataSource ds = (DataSource) ctx.lookup(jndi); _^F%$K6
Connection cn = ds.getConnection(); =jRC4]M})
多用于jsp中 nA+gqY6 6|
2、执行sql语句 1]7v3m
1)用Statement来执行sql语句 p4Xhs@.k
String sql; kyD*b3MN
Statement sm = cn.createStatement(); NcIr;
}
sm.executeQuery(sql); // 执行数据查询语句(select) k,r}X:<6jz
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Qgl5Jr.
2)用PreparedStatement来执行sql语句 k_ijVfI9
String sql; Pm|S>r
sql = "insert into user (id,name) values (?,?)";
NF_[q(k'
PreparedStatement ps = cn.prepareStatement(sql); 2K{)8;^
ps.setInt(1,xxx); !LpFK0rw
ps.setString(2,xxx); 4/&.N]
... .gw6W0\F
ResultSet rs = ps.executeQuery(); // 查询 8oP"?ew#
int c = ps.executeUpdate(); // 更新 x\5\KGw16
QV=|'
S
3、处理执行结果 <T$rvS
查询语句,返回记录集ResultSet en16hd>^W:
更新语句,返回数字,表示该更新影响的记录数 AD"L>7
ResultSet的方法 h{e?Fl
1、next(),将游标往后移动一行,如果成功返回true;否则返回false twql)lbx
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 qB3=wFI
@P<Mc)o^
4、释放连接 ` =I@W
cn.close(); ],f%:
?%50
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection FW"gj\
? UBE0C
可滚动、更新的记录集 5Yx
7Q:D
1、创建可滚动、更新的Statement 257q%"
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ->&amPv
该Statement取得的ResultSet就是可滚动的 '\Uy;,tu /
2、创建PreparedStatement时指定参数 ;VgB!
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Yg]!`(db
ResultSet.absolute(9000); Kd3EZo.
批量更新 HhB'
^)
1、Statement w?M` gl8r
Statement sm = cn.createStatement(); >jm^MS=
sm.addBatch(sql1); x)e(g}n
sm.addBatch(sql2); Xxs0N_va&
... b|g=&T:pp
sm.executeBatch() r} a,
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 +J:wAmY4
2、PreparedStatement z;EDyd,O>
PreparedStatement ps = cn.preparedStatement(sql); 5f_1 dn
{ ]"U/3dL5
ps.setXXX(1,xxx); -VZ?
c
... 8?$XT
ps.addBatch(); Opf^#6'mq
} X"v)9p
ps.executeBatch(); Vpf7~2[q%
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 E
<h9o>h
IlMst16q5
事务的处理 Ny 7vId
1、关闭Connection的自动提交 ^xF-IA#ZeB
cn.setAutoCommit(false); G8OnNI
2、执行一系列sql语句 8>ODtKI*
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close e1 P(-V
Statement sm ; =tqChw
sm = cn.createStatement(insert into user...); | <- t
sm.executeUpdate(); biAa&
sm.close(); 6i*LP(n
sm = cn.createStatement("insert into corp...); `5t
CmU
sm.executeUpdate(); 3aEO9v,n
sm.close(); QZ_8r#2x
3、提交 Cq<k(TKAX
cn.commit(); S(hT3MAW
4、如果发生异常,那么回滚 O|0} m
cn.rollback();