java 数据库基本操作 3ZNm ,{
1、java数据库操作基本流程 VEAf,{)Q
2、几个常用的重要技巧: eNN)2-96
可滚动、更新的记录集 ?+S jt
批量更新 `TNWLD@Z
事务处理 Y{P0?`
TxZ ^zj
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 %{$iN|%J%$
1、取得数据库连接 P$E #C:=
1)用DriverManager取数据库连接 zcCX;N
例子 ha6jbni
String className,url,uid,pwd; H f}->
className = "oracle.jdbc.driver.OracleDriver"; DyiyH%SSD
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; `usX(snY
uid = "system"; 1#H=<iJ
pwd = "manager"; *QAcp` ;*
Class.forName(className); ,v;P@RL|g
Connection cn = DriverManager.getConnection(url,uid,pwd); _97A9wHj
2)用jndi(java的命名和目录服务)方式 Gni<@;}
例子 yyZV/
x~
String jndi = "jdbc/db"; | /,XdTSy
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); [[(29|`]
DataSource ds = (DataSource) ctx.lookup(jndi); T%kr&XsQX
Connection cn = ds.getConnection(); tuzw%=Ey
多用于jsp中 rwb7>]UI"d
2、执行sql语句 0pT?qsM2
1)用Statement来执行sql语句
^J,Zl`N
String sql; V4]t=3>
Statement sm = cn.createStatement(); gzS6{570
sm.executeQuery(sql); // 执行数据查询语句(select) %5|awWo_?
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 5VWyc9Q
2)用PreparedStatement来执行sql语句 Q/EHvb]
String sql; }E626d}uA
sql = "insert into user (id,name) values (?,?)"; [R$iX
PreparedStatement ps = cn.prepareStatement(sql); <=;#I_E#E
ps.setInt(1,xxx); 4L(/Z}(
ps.setString(2,xxx); (=n {LMa
... 3z$9jN/<u
ResultSet rs = ps.executeQuery(); // 查询 "M.\Z9BCt
int c = ps.executeUpdate(); // 更新 ,Y|WSKY*
d{?X:*F
3、处理执行结果 Opc, {,z6
查询语句,返回记录集ResultSet .t\#>Fe
更新语句,返回数字,表示该更新影响的记录数 }Gmwm|`*
ResultSet的方法 4+fWIY1
"
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 9VyY[&
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 R"NR-iU
J[6`$$l0
4、释放连接 Ke0j8|
cn.close(); 9ohaU
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ]"Y?
ZS;H
yu ~Rk
可滚动、更新的记录集 dtHB@\1
1、创建可滚动、更新的Statement 4[=vt
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); e nsou!l
该Statement取得的ResultSet就是可滚动的 ,,_$r7H`
2、创建PreparedStatement时指定参数 (~6oA f
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); !g=2U`j^
ResultSet.absolute(9000); "uR,WY
批量更新 EqW/Wxv7b
1、Statement Fk01j;k.H
Statement sm = cn.createStatement(); 49vKb(bz{
sm.addBatch(sql1); AN-qcp6=o
sm.addBatch(sql2); DbRq,T
... '6Lw<#It
sm.executeBatch() 1D3{\v
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 g"pjWj)?
2、PreparedStatement 6_KO6O7g
PreparedStatement ps = cn.preparedStatement(sql); Gt>*y.]
{ n#F:(MSOp
ps.setXXX(1,xxx); E0 ~\ A;
... luNEgCq
ps.addBatch(); kzq3-NTV
} Yyl(<,Yi
ps.executeBatch(); x+niY;Z E
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 y7a84)j3
WvV!F?uqZ
事务的处理 %ZT@&
1、关闭Connection的自动提交 8_yhV{
cn.setAutoCommit(false); W dM?{;
#
2、执行一系列sql语句 H{Fww4pn
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ^! ?wh
Statement sm ; ma__LWKM,
sm = cn.createStatement(insert into user...); QtM9G@%
sm.executeUpdate(); WX@a2c.'
sm.close(); N@Fof(T&
sm = cn.createStatement("insert into corp...); OAGI|`E$/-
sm.executeUpdate(); 6x?3%0Km
sm.close(); *^|.bBG
3、提交 5,H,OZ}
cn.commit(); HB+{vuN*L
4、如果发生异常,那么回滚 WS17DsWW
cn.rollback();