java 数据库基本操作 1
&-%<o
1、java数据库操作基本流程 Nn{/_QG
2、几个常用的重要技巧: ,% *Jm
可滚动、更新的记录集 jhB+ ]
批量更新 g:2\S=
事务处理 iJSyi;l|
1EQLsg`d^
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 9t+:L(*pK
1、取得数据库连接 $g '4'
1)用DriverManager取数据库连接 PMZ*ECIJU
例子 (".WJXB\
String className,url,uid,pwd; !laOiH
className = "oracle.jdbc.driver.OracleDriver"; n0b{Jg *
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; @<z#a9
uid = "system"; N**"u"CX
pwd = "manager"; C^ZDUj`
Class.forName(className); rqEP!S^
Connection cn = DriverManager.getConnection(url,uid,pwd); ;Swj`'7
2)用jndi(java的命名和目录服务)方式 cv9-ZOxJ
例子 ,U=7#Cf!
String jndi = "jdbc/db"; bYwe/sR
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 9d8U@=
DataSource ds = (DataSource) ctx.lookup(jndi); )TOKHN
Connection cn = ds.getConnection(); ALt^@|!d
多用于jsp中 q(Zu;ecBN
2、执行sql语句 4IXa[xAm
1)用Statement来执行sql语句 $: qrh66
String sql; ZG)6{WS
Statement sm = cn.createStatement(); 8_{XrTw(
sm.executeQuery(sql); // 执行数据查询语句(select) B+lnxr0t
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); r?}L^bK
2)用PreparedStatement来执行sql语句 `g'z6~c7n
String sql; EHda
sql = "insert into user (id,name) values (?,?)"; r-ljT<f%J[
PreparedStatement ps = cn.prepareStatement(sql); SOeRQb'
ps.setInt(1,xxx); VV"1I R
ps.setString(2,xxx); Eg0qY\'
... NLZUAtx(
ResultSet rs = ps.executeQuery(); // 查询 /,3:<I
int c = ps.executeUpdate(); // 更新 ]lA.?
yT h60U
3、处理执行结果 g&O!w!T
查询语句,返回记录集ResultSet O>>%lr|
更新语句,返回数字,表示该更新影响的记录数 2qPQ3-'
ResultSet的方法 \"l/D?+Q
1、next(),将游标往后移动一行,如果成功返回true;否则返回false M(.Up
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 *7K)J8kq
jo ~p#l.'
4、释放连接 _}Ec[c
cn.close(); dgW/5g
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection tV9 K5ON
*
NdL4c~
可滚动、更新的记录集 B8 R&Q8Q
1、创建可滚动、更新的Statement bf$4Z: Y
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); CxJH)H$
该Statement取得的ResultSet就是可滚动的 9FmX^t$T
2、创建PreparedStatement时指定参数 Kr74|W=
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); >?ckBU9
ResultSet.absolute(9000); ])mYE
}g
批量更新 *"sDsXo- I
1、Statement z+X DN:
Statement sm = cn.createStatement(); FoGSCg%
sm.addBatch(sql1); XXC(R
sm.addBatch(sql2); *!L
it:H
... qm|T<zsDY#
sm.executeBatch() kT4Oal+4
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 kqp*o+Oz',
2、PreparedStatement YE1X*'4
PreparedStatement ps = cn.preparedStatement(sql); 3<ry/{#%
{ =l1O9/\9
ps.setXXX(1,xxx); @1+({u#B
... mY!&*nYn|
ps.addBatch(); 'v_VyK*w
} Dt]*M_
ps.executeBatch(); @M8vPH
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 btv.M
o7t#yw3
事务的处理 wQ~F%rQ$
1、关闭Connection的自动提交 rWxQ;bb#
cn.setAutoCommit(false); ^Mi&2AvS
2、执行一系列sql语句 P> ilRb
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close o 9{~F`{p
Statement sm ; <wO8=bem
sm = cn.createStatement(insert into user...); IjnO2X
sm.executeUpdate(); 'U'Y[*m@
sm.close(); lb[\Lzdvmu
sm = cn.createStatement("insert into corp...); ,|Lf6k
sm.executeUpdate(); 1bpjj'2%x
sm.close(); "CF{Mu|Q=
3、提交 3NxwQ,~
cn.commit(); i8>^{GODR
4、如果发生异常,那么回滚 |(O _K(
cn.rollback();