java 数据库基本操作 4U1fPyt
1、java数据库操作基本流程 wbKBwI5w
2、几个常用的重要技巧: !x /Z"
可滚动、更新的记录集 Pb&+(j
批量更新 Jy
NY *
事务处理 Z 2jMBe
-.3k
vL
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 D_kzR
1、取得数据库连接 XQ y|t"Vq>
1)用DriverManager取数据库连接 *G"#.YvE
例子 *wyLX9{:
String className,url,uid,pwd; [4yQbqe;
className = "oracle.jdbc.driver.OracleDriver"; #EK8Qe_
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Mp}NUQHE
uid = "system"; d(tf: @
pwd = "manager"; PS;*N8
Class.forName(className); dV*rnpN
Connection cn = DriverManager.getConnection(url,uid,pwd); 3sIM7WD?
2)用jndi(java的命名和目录服务)方式 m8A1^ R
例子 C8zeqS^N
String jndi = "jdbc/db"; m|gd9m$,?
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); JJ06f~Iw[
DataSource ds = (DataSource) ctx.lookup(jndi); A{"t0Ai='0
Connection cn = ds.getConnection(); UC$+&&rO
多用于jsp中 q)y8Bv|
2、执行sql语句 mV]g5>Q\
1)用Statement来执行sql语句 [:'?}p
String sql; \`5u@Nzx
Statement sm = cn.createStatement(); J~`%Nj5>
sm.executeQuery(sql); // 执行数据查询语句(select) $F$R4?_
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); @n'ss!h
2)用PreparedStatement来执行sql语句 YQsc(6
String sql; Y|jesa {x
sql = "insert into user (id,name) values (?,?)"; HBGA
lZ
PreparedStatement ps = cn.prepareStatement(sql); Upen/1 bA
ps.setInt(1,xxx); S*@0%|Q4r
ps.setString(2,xxx); H5t`E^E
... @x
]^blq
ResultSet rs = ps.executeQuery(); // 查询 >&z+ih
int c = ps.executeUpdate(); // 更新 (19<8a9G
u6d~d\
3、处理执行结果 }f*S 9V
查询语句,返回记录集ResultSet rmJ847%y`
更新语句,返回数字,表示该更新影响的记录数 HKw4}FC*
ResultSet的方法 a$&6a
1、next(),将游标往后移动一行,如果成功返回true;否则返回false %*}f<k{6
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 6VE5C
g
h(up1(x
4、释放连接 ^C
T}i'
cn.close(); e:occT
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection |:BYOxAYZ8
j"8N)la
可滚动、更新的记录集 1"PE@!]
1、创建可滚动、更新的Statement Ux]@prA q
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 1yc@q8
该Statement取得的ResultSet就是可滚动的
>ON.ftZi
2、创建PreparedStatement时指定参数 ]iX$p~riH
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Rj=Om
ResultSet.absolute(9000); _@76eZd
批量更新 z*1K<w8
1、Statement uS,$P34^oy
Statement sm = cn.createStatement(); fdW={}~
sm.addBatch(sql1); ZM!~M>B9R
sm.addBatch(sql2); uMZf9XUE
... #C}(7{Vt
sm.executeBatch() OUMr}~/
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ~cwwB{
2、PreparedStatement mr.DP~O:9p
PreparedStatement ps = cn.preparedStatement(sql); _"`h~jB
{ 4N:
;Mo&B
ps.setXXX(1,xxx); 6>J#M
... MqH~L?~}|
ps.addBatch(); 2wvDC@
} eQj/)@B:V
ps.executeBatch(); &i RX-)^u
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Wno5B/V
\ }f*
事务的处理 q>X2=&1
1、关闭Connection的自动提交 D3ad2vH
cn.setAutoCommit(false); *h6i9V%'
2、执行一系列sql语句 0k [6
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close nsk
6a
Statement sm ; b"9,DQB=i
sm = cn.createStatement(insert into user...); 3J<,2
sm.executeUpdate(); {Wo7=aR
sm.close(); 4pv:u:Z
sm = cn.createStatement("insert into corp...); &.B6P|N'
sm.executeUpdate(); IrC=9%pd$R
sm.close(); 3}Qh`+Yj]
3、提交 K4~Ox
cn.commit(); c
@R6p+
4、如果发生异常,那么回滚 Fwqf4&/
cn.rollback();