java 数据库基本操作 LCMZw6p
1、java数据库操作基本流程 N;mJHr3[F
2、几个常用的重要技巧: 5v_vv'~
可滚动、更新的记录集 0i4XS*vPv
批量更新 o~`KOe
事务处理 yBkcYHT
d3jzGJrU}
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ?, m_q+
1、取得数据库连接 p:?h)'bA<
1)用DriverManager取数据库连接 \PL0-.t,
例子 `NB6Of*/
String className,url,uid,pwd; :D:Y-cG*n<
className = "oracle.jdbc.driver.OracleDriver"; F XG,DJ:
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; @Pb%dS
uid = "system"; mV++7DY
pwd = "manager"; Qy7 pM8~h
Class.forName(className); cTa$t :K@
Connection cn = DriverManager.getConnection(url,uid,pwd); M.u1SB0
2)用jndi(java的命名和目录服务)方式 mPJ@hr%3
例子 s0\}Q=s[
String jndi = "jdbc/db"; !$pnE:K
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 32z2c:G
DataSource ds = (DataSource) ctx.lookup(jndi); *6/OLAkyF
Connection cn = ds.getConnection(); 8/"R&yAh
多用于jsp中 k, >*.Yoh
2、执行sql语句 (MzThGJK_
1)用Statement来执行sql语句 =k\Qx),Ir
String sql; EV[ BB;eb
Statement sm = cn.createStatement(); %v)+]Ds{
sm.executeQuery(sql); // 执行数据查询语句(select) Zt
;u8O
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); zXaA5rZO
2)用PreparedStatement来执行sql语句 2ut)m\)/)
String sql; .g>0FP
sql = "insert into user (id,name) values (?,?)"; 4L<;z'
PreparedStatement ps = cn.prepareStatement(sql); Oh;V%G
ps.setInt(1,xxx); q_86nvB<
ps.setString(2,xxx); zT+ "Z(oz,
... yF@72tK
ResultSet rs = ps.executeQuery(); // 查询 ZKF
#(G
int c = ps.executeUpdate(); // 更新 QP7N#mh
ZLlAK ?N
3、处理执行结果 avy@)iO7
查询语句,返回记录集ResultSet WCyjp
更新语句,返回数字,表示该更新影响的记录数 KMP[Ledr
ResultSet的方法 R/P9 =yvg0
1、next(),将游标往后移动一行,如果成功返回true;否则返回false EYR%u'&7'
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 jZR2Nx}16
k2:mIp\
4、释放连接 XM~eocn
cn.close(); +ux170Cd3
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 1
&-%<o
%@^9(xTE
可滚动、更新的记录集 (nAg
~i
1、创建可滚动、更新的Statement >A>_UT_"
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ODCv^4}9
该Statement取得的ResultSet就是可滚动的 b&P2VqYgl
2、创建PreparedStatement时指定参数 @m+FAdA 0
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); U-pBat.$'C
ResultSet.absolute(9000); v(`5exWV
批量更新 of/'
9Tj
1、Statement chXTFLC~
Statement sm = cn.createStatement(); UHS{X~CS
e
sm.addBatch(sql1); aC#{@t
sm.addBatch(sql2); %`0*KMO3
...
U92?e}=]
sm.executeBatch() sNs Hl
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 $D;-;5[-/r
2、PreparedStatement Gdv{SCV
PreparedStatement ps = cn.preparedStatement(sql); QRHM#v S
{ !laOiH
ps.setXXX(1,xxx); #B@*-
... JlE b
ps.addBatch(); :LLz$[c8
} qJK-HF:#
ps.executeBatch(); =~q Xzq
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 UQnv#a>
:Fdk`aC
事务的处理 \OVw
1、关闭Connection的自动提交 :~\ y<
cn.setAutoCommit(false); ;Swj`'7
2、执行一系列sql语句 Voo_
?
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 5@EX,$h
Statement sm ; wpa^]l
sm = cn.createStatement(insert into user...); <4Ik]Uz^
sm.executeUpdate();
u"-."_
sm.close(); x }i'2
sm = cn.createStatement("insert into corp...); qkD9xFp
sm.executeUpdate(); )TOKHN
sm.close(); 'Ooq.jaK;/
3、提交 r<pt_Cd
cn.commit(); XL`i9kV?
4、如果发生异常,那么回滚 # 66vkf*
cn.rollback();