java 数据库基本操作 x!{
1、java数据库操作基本流程 CmC0k-%w
2、几个常用的重要技巧: >q( 5ir
可滚动、更新的记录集 CMVS W6
批量更新 `| 9K u
事务处理 $C_M&O}
PnWD}'0V
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 WYIw5jzC
1、取得数据库连接 F|eu<^"$ H
1)用DriverManager取数据库连接 \2DE==M)P
例子 }C6@c1myq-
String className,url,uid,pwd; Q7Ij4
className = "oracle.jdbc.driver.OracleDriver"; c?6d2jH.
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Q_P5MLU>
uid = "system"; L7q | ^`
pwd = "manager"; }5gr5g\OtP
Class.forName(className); _vrWj<wyf
Connection cn = DriverManager.getConnection(url,uid,pwd); w=J4zkWk
2)用jndi(java的命名和目录服务)方式 T%I&txl
例子 RsSXhPk?
String jndi = "jdbc/db"; W"sr$K2m|
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); b~Z=:'m8
DataSource ds = (DataSource) ctx.lookup(jndi); D s-`
Connection cn = ds.getConnection(); y4F^|kS) [
多用于jsp中 gg]~2f
2、执行sql语句 -J$g(sikt
1)用Statement来执行sql语句 moO_-@i
String sql; kL7^$
Statement sm = cn.createStatement(); ?SX_gYe9
sm.executeQuery(sql); // 执行数据查询语句(select) 1r4,XSk
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 981!2*
2)用PreparedStatement来执行sql语句 EF;,Gjh5p
String sql; 31XU7A
sql = "insert into user (id,name) values (?,?)"; olty4kGD$V
PreparedStatement ps = cn.prepareStatement(sql); ROoE%%8I
ps.setInt(1,xxx); 0n5UKtB
ps.setString(2,xxx); @>O&Cpt
... v]bAWo
ResultSet rs = ps.executeQuery(); // 查询 f=ib9WbR#
int c = ps.executeUpdate(); // 更新 TETsg5#
.hN3`>*V
3、处理执行结果 h~ha
查询语句,返回记录集ResultSet rSyaZ6#
更新语句,返回数字,表示该更新影响的记录数 0j@Ix EPs
ResultSet的方法 9~Xg#{
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Fk$@Yy+}e
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Y><(?
D@hmO]5c
4、释放连接 (!n-Age
cn.close(); E~He~wHWe
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection &&C~@WY,r
wItz cY1m
可滚动、更新的记录集 i QqbzOY
1、创建可滚动、更新的Statement D44I"TgqD
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); G%OpO.Wf
该Statement取得的ResultSet就是可滚动的 k+\7B}7F
2、创建PreparedStatement时指定参数 q3\!$IM.
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); I7Zq}Pxa
ResultSet.absolute(9000); kPJ~X0Fr{t
批量更新 ?UK:sF|(O
1、Statement +"=~o5k3Q
Statement sm = cn.createStatement(); >B~?dT m
sm.addBatch(sql1); s1=u{ET
sm.addBatch(sql2); nHU3%%%cU
... Y n>{4BZ>#
sm.executeBatch() 6D^%'[4t
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 r}@< K
2、PreparedStatement ,4Y sZ
PreparedStatement ps = cn.preparedStatement(sql); Qa?QbHc
{ vs*I7<
ps.setXXX(1,xxx); ;U7t
... )/TVJAJ
ps.addBatch(); @7|)RSBQz
} M,{<TpCx
ps.executeBatch(); YHh u^}|jQ
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 y Hw!#gWM
bV7QVu8
事务的处理 rxkBg0Z`a
1、关闭Connection的自动提交 mt .,4
cn.setAutoCommit(false); }2xb&6g~o
2、执行一系列sql语句 o}R|tOe
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close :eLLDp<
Statement sm ; 2o}8W7y
sm = cn.createStatement(insert into user...); $y4M#yv
sm.executeUpdate(); JOHp?3 "4
sm.close(); %#Q
#N,fw
sm = cn.createStatement("insert into corp...); QQ|9>QP
sm.executeUpdate(); qid1b
b
sm.close(); "2K|#,%N
3、提交 V,'FlU
cn.commit(); %>NRna
4、如果发生异常,那么回滚 ndt8=6p
cn.rollback();