java 数据库基本操作 vTJ}8
1、java数据库操作基本流程 80Gn%1A9
2、几个常用的重要技巧: g7OqX \
可滚动、更新的记录集 gK[YQXfTy
批量更新 @te!Jgu{
事务处理 .=X}cJ]`[
EUN81F?
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 $shoasSuI
1、取得数据库连接 :9^;Qv*
1)用DriverManager取数据库连接 &(xH$htv1
例子 i 7x7xtq
String className,url,uid,pwd; 4}4Pyjh
className = "oracle.jdbc.driver.OracleDriver"; A29gz:F(
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; |j#C|V%kV
uid = "system"; m]5Cq6
pwd = "manager"; T>R0T{A
Class.forName(className); FW/W%^
Connection cn = DriverManager.getConnection(url,uid,pwd); M#As0~y
2)用jndi(java的命名和目录服务)方式 ;#oie<
Vit
例子 `Ye\p6v!+
String jndi = "jdbc/db"; <8d^^0
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); !f&Kf,#b`
DataSource ds = (DataSource) ctx.lookup(jndi); :=wTvz
Connection cn = ds.getConnection(); }j*KcB_
多用于jsp中 ^eR%N8Z
2、执行sql语句 h-Fn?
1)用Statement来执行sql语句 DDPxmuNG
String sql; hvDNz"ec{
Statement sm = cn.createStatement(); `kZ@Zmj#
sm.executeQuery(sql); // 执行数据查询语句(select) }M3fmAP}
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Z;:u'=
2)用PreparedStatement来执行sql语句 }^/9G17
String sql; u%$Zqee
sql = "insert into user (id,name) values (?,?)"; 1oN^HG6O
PreparedStatement ps = cn.prepareStatement(sql); 1@QZnF5[
ps.setInt(1,xxx); V`bi&1?6\
ps.setString(2,xxx); 5A
sP5
... ,!7 H]4Qx
ResultSet rs = ps.executeQuery(); // 查询 1e&QSzL
int c = ps.executeUpdate(); // 更新 h $L/<3oP6
;uwRyd
3、处理执行结果 #m{UrTC
查询语句,返回记录集ResultSet |aT| l^2R@
更新语句,返回数字,表示该更新影响的记录数 UG'9*(*
ResultSet的方法 #ZYVc|sT+
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 5ZMR,SZhC
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 $CY't'6Hn
-5I2ga
4、释放连接 ~:3QBMk::
cn.close(); DsT>3
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ,]+z)
\hM|(*DL
可滚动、更新的记录集 WIv?}gi:
X
1、创建可滚动、更新的Statement =y/8^^
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); U2ZD]q
该Statement取得的ResultSet就是可滚动的
\9/ b!A
2、创建PreparedStatement时指定参数 Lz:(6`S
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Yx eOI#L
ResultSet.absolute(9000); ~wJFa'2
批量更新 8erSt!oM
1、Statement >|twyb
Statement sm = cn.createStatement(); 't6V:X
sm.addBatch(sql1); /)4I|"}R0I
sm.addBatch(sql2); _g~qu
[1
... |b|&XB_<]Z
sm.executeBatch() )*,5"CO
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 k[HAkB \{
2、PreparedStatement tb$LriN
PreparedStatement ps = cn.preparedStatement(sql); brdmz}
{ 0 0M@
ps.setXXX(1,xxx); Kwg4sr5"D
... n(L\||#+
ps.addBatch(); 4Qo]nre!
} + j W1V}h
ps.executeBatch(); 8[J}CdS
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Up,vD)tG
mL_j4=ER@
事务的处理
AiK
1、关闭Connection的自动提交 jSwf*u
cn.setAutoCommit(false); \o/n
2、执行一系列sql语句 |Tm!VFd
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close DBT&DS
Statement sm ; '*?WU_L(g
sm = cn.createStatement(insert into user...); F$hYKT2|
sm.executeUpdate(); LWHd~"eU
sm.close(); kn>$lTHQ
sm = cn.createStatement("insert into corp...);
8`fjF/
sm.executeUpdate(); yq NzdzX
sm.close(); Wh%ucX&
3、提交 RW }"2
cn.commit(); yRiP{$E
4、如果发生异常,那么回滚 k31I ysh
cn.rollback();