java 数据库基本操作
eUl[gHP
1、java数据库操作基本流程 IKt9=Tx
2、几个常用的重要技巧: Cfi5r|S
可滚动、更新的记录集 G} p~VLf
批量更新 F~:5/-zs
事务处理 *m7e>]-
mEA w^
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 `JC!uc
1、取得数据库连接 x-"7{@lz
1)用DriverManager取数据库连接 ^m~=<4eX
例子 W{%M+a[#l
String className,url,uid,pwd; 9X-DR
className = "oracle.jdbc.driver.OracleDriver"; c;WS !.
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; E'C[+iK6,
uid = "system";
@`T6\ 1
pwd = "manager"; )}EwEM
Class.forName(className); ,yC~{H
Connection cn = DriverManager.getConnection(url,uid,pwd); R75sK(oS
2)用jndi(java的命名和目录服务)方式 EV}%D9:
例子 vO\CPb
%/
String jndi = "jdbc/db"; S+He
Context ctx = (Context) new InitialContext().lookup("java:comp/env");
zd}"8
DataSource ds = (DataSource) ctx.lookup(jndi); d"V^^I)yx&
Connection cn = ds.getConnection(); $HaM,
Oh;i
多用于jsp中 4:K9FqU
2、执行sql语句 f}fM%0/5
1)用Statement来执行sql语句 hfY2pG9N
String sql; jWm<!<~
Statement sm = cn.createStatement(); Mqna0"IYx*
sm.executeQuery(sql); // 执行数据查询语句(select) C 9DRVkjj
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); a+Z/=YUR
2)用PreparedStatement来执行sql语句 $ (GXlhA
String sql; {3l]/X3
sql = "insert into user (id,name) values (?,?)"; KjhOz%Yt[o
PreparedStatement ps = cn.prepareStatement(sql); m49)c K?
ps.setInt(1,xxx); LEY$St
ps.setString(2,xxx); $:>K-4X\}
...
Eg
;r]?|6
ResultSet rs = ps.executeQuery(); // 查询 FN G]
int c = ps.executeUpdate(); // 更新 _- { > e
1>n@`M8}
3、处理执行结果 ZM\Z2L]n
查询语句,返回记录集ResultSet l{kum2DT
更新语句,返回数字,表示该更新影响的记录数 tY VmB:l
ResultSet的方法 At"@`1n_u'
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 7%C6gU!r
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 zh7NXTzyf
}LOAT$]XI
4、释放连接 M4`qi3I
cn.close(); j2V^1
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection f`T#=6C4|
K1jE_]@Z
可滚动、更新的记录集 G/b
$cO}
1、创建可滚动、更新的Statement h^cM#L^B
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); iXI >>9
该Statement取得的ResultSet就是可滚动的 rxt)l
2、创建PreparedStatement时指定参数 I t",WFE.
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); H}`}qu #~V
ResultSet.absolute(9000); "OkJPu2!W
批量更新 %R."
1、Statement =5J}CPKbZI
Statement sm = cn.createStatement(); uvi+#4~G
sm.addBatch(sql1); g6MK~JG$?h
sm.addBatch(sql2); Rjt]^gb!*
... ]U82A**n
sm.executeBatch() bs/Vn'CE
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 n2cb,b/7
2、PreparedStatement 4;=+qb
PreparedStatement ps = cn.preparedStatement(sql); 4YMX;W
{ 'b~,/lZd
ps.setXXX(1,xxx); <<4U:
... VB o=*gn,$
ps.addBatch(); ;Lr]w8d
} R `
ps.executeBatch(); G*^4+^Vz?
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 bL-+
^zn&"@
事务的处理 lk;4l Z
1、关闭Connection的自动提交 >cJf D9-<h
cn.setAutoCommit(false); OO#_0qK
2、执行一系列sql语句 }hRw{#*8
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 2!QQypQ
Statement sm ; ZOw%Fw4B
sm = cn.createStatement(insert into user...); db#svj*
sm.executeUpdate(); x4v@o?zW
sm.close(); VUmf;~
sm = cn.createStatement("insert into corp...); =S#9\W&