java 数据库基本操作 Y2j>lf?8
1、java数据库操作基本流程 J1Mm,LTO
2、几个常用的重要技巧: jcN84AaRFI
可滚动、更新的记录集 MwL'
H<
批量更新 *J?QXsg
事务处理 d5]9FIj
Y*O7lZuF%
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 S)z
jfJR
1、取得数据库连接 ,:QG%Et
1)用DriverManager取数据库连接 [bJ/$A
例子 e%j+,)Ry
String className,url,uid,pwd; :KZI+
className = "oracle.jdbc.driver.OracleDriver"; 7CABM
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ^v3ytS
uid = "system"; )ye[R^!}
pwd = "manager"; ^DVr>u
Class.forName(className); //:.k#}~B
Connection cn = DriverManager.getConnection(url,uid,pwd); 1&Rz'JQ+
2)用jndi(java的命名和目录服务)方式 Oe^3YOR#j{
例子 Vy{=Y(cpF2
String jndi = "jdbc/db";
SMk{159q&
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ?b:J6(-
DataSource ds = (DataSource) ctx.lookup(jndi); {Zjnf6d]
Connection cn = ds.getConnection(); AShJtxxa
多用于jsp中 z['>`Kt
2、执行sql语句 YU[93@mCh
1)用Statement来执行sql语句 8[ 1D4d
String sql; a|32Pn
Statement sm = cn.createStatement(); `Qv7aY
sm.executeQuery(sql); // 执行数据查询语句(select) O qY8\>f-
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); lKI1bs]i
2)用PreparedStatement来执行sql语句 6CLrP}
u
String sql; 95aa
sql = "insert into user (id,name) values (?,?)"; J:'cj5@
PreparedStatement ps = cn.prepareStatement(sql); WO)rJr!C
ps.setInt(1,xxx); !~m)_Q5?~
ps.setString(2,xxx); tk<dp7y7
... ]OM|Oo
ResultSet rs = ps.executeQuery(); // 查询 ,$mnD@)
int c = ps.executeUpdate(); // 更新 G|Ic6Sd
&m`1lxT
3、处理执行结果 vML01SAi
查询语句,返回记录集ResultSet +e%9P%[+
更新语句,返回数字,表示该更新影响的记录数 Tm_AoZH
ResultSet的方法 xqO'FQO%
1、next(),将游标往后移动一行,如果成功返回true;否则返回false RERum
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ;)5d
wq
hv}rA,Yd
4、释放连接 Q4TI '/
cn.close(); EkEM|<GNd
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection AASw^A3p
)}=`Gx5+
可滚动、更新的记录集
A<r@,*(g
1、创建可滚动、更新的Statement AR]y p{NS
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); K/+5$SjF
该Statement取得的ResultSet就是可滚动的 K&9|0xt
2、创建PreparedStatement时指定参数 @ ILG3"
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); y;yXOE_
ResultSet.absolute(9000); B1JdkL 3h
批量更新 0lF[N.!\9
1、Statement nE+sbfC
Statement sm = cn.createStatement(); *pk*ijdB
sm.addBatch(sql1); Q{UR3U'Q
sm.addBatch(sql2); Zb8Ty~.\P
... K!5QFO4
sm.executeBatch() 234OJ?
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 4VSlgoz
2、PreparedStatement Y;p _ff
PreparedStatement ps = cn.preparedStatement(sql); ?zQ\u{]=
{ c\-5vw||b
ps.setXXX(1,xxx); >,y291p2
... W @`Nn*S
ps.addBatch(); 3)T'&HKQ
} ~{0:`)2FQ
ps.executeBatch(); a:Y6yg%1>
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 g6IG>)
'49&qO5B
事务的处理 =2\k
Jv3
1、关闭Connection的自动提交 nY'0*:'u
cn.setAutoCommit(false); tjBs>w
2、执行一系列sql语句 rC14X} X6
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close (8qMF{
Statement sm ; 5CueD]
sm = cn.createStatement(insert into user...); yN5g]U.Q
sm.executeUpdate(); Y]P';C_eP
sm.close(); wP/&k`HQ#i
sm = cn.createStatement("insert into corp...); >zFe)
sm.executeUpdate(); `g<@F^x5
sm.close(); 7u6o~(
3、提交 BdG~y1%:
cn.commit(); "2i{ L '
4、如果发生异常,那么回滚 3DV';
cn.rollback();