java 数据库基本操作 /,~g"y.;,
1、java数据库操作基本流程 Z:^ S-h
2、几个常用的重要技巧: aMVq%{U
可滚动、更新的记录集 y0p\Gu;3j
批量更新 nPDoK!r'
事务处理 @2On`~C`
X4+H8],)
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 +(W7hK4ip
1、取得数据库连接 y.s\MWvv>u
1)用DriverManager取数据库连接 UFC^lv
例子 7#SfuZ0@
String className,url,uid,pwd; rU(-R@["
className = "oracle.jdbc.driver.OracleDriver"; wEN[o18{
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; /`0>U
uid = "system"; Z>l<.T"t'
pwd = "manager"; 4?bvJJuf)
Class.forName(className); t/3HX]B_
Connection cn = DriverManager.getConnection(url,uid,pwd); g)!q4
-q
2)用jndi(java的命名和目录服务)方式 ))nTd=
例子 6 !N2B[9
String jndi = "jdbc/db"; yb)qg]2
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Ypxp4B
DataSource ds = (DataSource) ctx.lookup(jndi); +1@'2w{
Connection cn = ds.getConnection(); ?b"'w
多用于jsp中 -s1.v$g
2、执行sql语句 4j'`,a=
1)用Statement来执行sql语句 e {3%-
String sql; L}'^FqO[IW
Statement sm = cn.createStatement(); 27}7
n
sm.executeQuery(sql); // 执行数据查询语句(select) <_]W1V:0
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ]h=5d09z
2)用PreparedStatement来执行sql语句 gVy`||z
String sql; U9*< dR
sql = "insert into user (id,name) values (?,?)"; z`NJelcuz\
PreparedStatement ps = cn.prepareStatement(sql); B@#vS=g
ps.setInt(1,xxx); k8l7.e*
ps.setString(2,xxx); YK5(o KFN
... ((<\VQ,>(
ResultSet rs = ps.executeQuery(); // 查询 *xITMi
int c = ps.executeUpdate(); // 更新 /a9CqK
C\OZs%]At
3、处理执行结果 JT~Dr KI_
查询语句,返回记录集ResultSet WF_QhKW|k
更新语句,返回数字,表示该更新影响的记录数 a5/Dz&>j6
ResultSet的方法 =-&h@mB;G
1、next(),将游标往后移动一行,如果成功返回true;否则返回false TtH!5{$s
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 3g5r}Ug
,?HM5c{'[Y
4、释放连接 mNEh\4ai
cn.close(); /k(wb4Hv
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection EziGkbpd@
DrbjklcUU
可滚动、更新的记录集 )]4=anJu@|
1、创建可滚动、更新的Statement t;-F]
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); nJ/}b/A{
该Statement取得的ResultSet就是可滚动的 FMhuCl2
2、创建PreparedStatement时指定参数 =+I-9=
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); qJ<l$Ig
ResultSet.absolute(9000); &49WfctT
批量更新 uBn35%
1、Statement FjLMN{eH/
Statement sm = cn.createStatement(); `%EcQ}Nr
sm.addBatch(sql1); 8R-;cBT
sm.addBatch(sql2);
]!N=Z
}LD
... JG7K-W|!c
sm.executeBatch() ^,)nuUy
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 8j :=D!S
2、PreparedStatement CS5[E-%}T=
PreparedStatement ps = cn.preparedStatement(sql); #0\* 86
{ 2-Wy@\
ps.setXXX(1,xxx); (ss,x CF
... ^HtB!Xc
ps.addBatch(); @8+v6z
} LGVy4D
ps.executeBatch();
r* l
c#
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ~*UY[!+4^=
)qOcx
I
事务的处理 qmenj
1、关闭Connection的自动提交 ?Zk;NL9
cn.setAutoCommit(false); Q#.E-\=^
2、执行一系列sql语句 <`NsX
6t
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Zm7,O8
Statement sm ; [1ClZ~f
sm = cn.createStatement(insert into user...); LafBf6wds
sm.executeUpdate(); ZLPj1L
sm.close(); M%W#0
sm = cn.createStatement("insert into corp...); <P6d-+
sm.executeUpdate(); '
I!/I
sm.close(); 8xG"hJR
3、提交 =dQ/^C_hj
cn.commit(); ^tI&5S]nE
4、如果发生异常,那么回滚 jUgx
;=
cn.rollback();