java 数据库基本操作 7U7!'xU
1、java数据库操作基本流程 cGm3LS6]*
2、几个常用的重要技巧: eEXNEgbn
可滚动、更新的记录集 cB&_':F
批量更新 -9vNV:c
事务处理 k A=5Kc
kq| !{_
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接
G#[A'tbKk
1、取得数据库连接 *iB&tWv
1)用DriverManager取数据库连接 AL":j6!OQ
例子 20I`F>-*
String className,url,uid,pwd; &G2&OFAr]q
className = "oracle.jdbc.driver.OracleDriver"; )>2L(~W
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; n1%2sV)>
uid = "system"; /<_!Gz.@uG
pwd = "manager"; ZH~bY2^;
Class.forName(className); BP..p ^EPN
Connection cn = DriverManager.getConnection(url,uid,pwd); 75a3hPCZ
2)用jndi(java的命名和目录服务)方式 yeyDB>#Va.
例子 h: yJ
String jndi = "jdbc/db"; 4T@+gy^.
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); a~Dk@>+P>
DataSource ds = (DataSource) ctx.lookup(jndi); `h'+4
Connection cn = ds.getConnection(); /KvJjt'8
多用于jsp中 _Q:z -si
2、执行sql语句 OUWK
1)用Statement来执行sql语句 brp3xgQ`]
String sql; DpggZ|J
Statement sm = cn.createStatement(); 0
s+X:*C~
sm.executeQuery(sql); // 执行数据查询语句(select) RP$u/x"b
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); z5gVP8*z5
2)用PreparedStatement来执行sql语句 UvGxA[~2+
String sql; JDf>Qg{
sql = "insert into user (id,name) values (?,?)"; 7:B/?E
PreparedStatement ps = cn.prepareStatement(sql); xHt7/8wF
ps.setInt(1,xxx); 4Q !A w
ps.setString(2,xxx); G,>YzjMY`
... \k5"&]I3
ResultSet rs = ps.executeQuery(); // 查询 U!uPf:p2
int c = ps.executeUpdate(); // 更新 Ma!
(F^R9G|
3、处理执行结果 2|x
!~e.
查询语句,返回记录集ResultSet %GTFub0F
更新语句,返回数字,表示该更新影响的记录数 UYxn?W.g
ResultSet的方法 SY|K9$M^
1、next(),将游标往后移动一行,如果成功返回true;否则返回false eL~xS: VT
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 o/3.U=px~
[.4{s
4、释放连接 ~AjPa}@ f
cn.close(); ]AQ}_dRi=
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection frUs'j/bZ
c\n_[r
可滚动、更新的记录集 x^@oY5}cr
1、创建可滚动、更新的Statement L ~'98C
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); O?g;Ny
该Statement取得的ResultSet就是可滚动的 tAq0Z)
2、创建PreparedStatement时指定参数 T9R#.y,
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); nrY)i_\
ResultSet.absolute(9000); mhVLlbY|t
批量更新 @'>RGaPV
1、Statement .X%J}c$
Statement sm = cn.createStatement(); zg3kU65PJE
sm.addBatch(sql1); uD@ZM
sm.addBatch(sql2);
g*a+$'
... PP{9Y Vr
sm.executeBatch() vyDxX
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 _yg;5#3
2、PreparedStatement Lfn$Q3}O`$
PreparedStatement ps = cn.preparedStatement(sql); ,=\.L_'
{ i{m!v6j:
ps.setXXX(1,xxx); T^Ia^B-%}g
... )Zr\W3yWX
ps.addBatch(); >SQzE
} "a].v 8l!
ps.executeBatch(); N
;=zo-8
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 XfE0P(sE
%SB4_ r*<
事务的处理 @\nQ{\^;
1、关闭Connection的自动提交 7SS#V
cn.setAutoCommit(false); q83^?0WD
2、执行一系列sql语句 ]=t}8H
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close h,FU5iK|
Statement sm ; +rU{-`dy9'
sm = cn.createStatement(insert into user...); IDn<5#
sm.executeUpdate(); ;4!H- qZ
sm.close(); MlYm\x8{M
sm = cn.createStatement("insert into corp...); QOEi.b8r
sm.executeUpdate(); `bBkPH}M
sm.close(); zYV{ |Z
3、提交 61Cc? a*_
cn.commit(); mDz44XO
4、如果发生异常,那么回滚 b9rQQS
cn.rollback();