java 数据库基本操作 4N>>+]MWc
1、java数据库操作基本流程 Da1aI]{I
2、几个常用的重要技巧: KZ:hKY@q
可滚动、更新的记录集 !0}\&<8/m
批量更新 ajH"Jy3A
事务处理 WF2-$`x
.*/Fucr
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 #JW+~FU`
1、取得数据库连接 ;;U:Jtn2
1)用DriverManager取数据库连接 qUJ
aeQ
例子 pPro }@@
String className,url,uid,pwd;
%Y nmuZ
className = "oracle.jdbc.driver.OracleDriver"; _e<o7Y@_
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; k;^
:
uid = "system"; V"KS[>>f
pwd = "manager"; /n,a?Ft^N)
Class.forName(className); x!<yT?A
Connection cn = DriverManager.getConnection(url,uid,pwd); 8?FueAM'
2)用jndi(java的命名和目录服务)方式 X` YwP/D
例子 _2ef LjXQ
String jndi = "jdbc/db"; 6;b9swmh
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); bZwnaM4"F
DataSource ds = (DataSource) ctx.lookup(jndi); f>$``.O
Connection cn = ds.getConnection(); @z`@f"l
多用于jsp中 hVpCB,
2、执行sql语句 ki]ti={12
1)用Statement来执行sql语句 T]9\VW4
String sql; F\JUx L@8
Statement sm = cn.createStatement(); cI0 ]}S
sm.executeQuery(sql); // 执行数据查询语句(select) Ukz;0q
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); j7QX,_Q
2)用PreparedStatement来执行sql语句 eDKxn8+(H
String sql; 3(E
$I5
sql = "insert into user (id,name) values (?,?)"; .^(/n9|o-
PreparedStatement ps = cn.prepareStatement(sql); B^ 7eo W
ps.setInt(1,xxx); [I*!
lbt
ps.setString(2,xxx); 8T[
6J{|C
... $D1w5o-
ResultSet rs = ps.executeQuery(); // 查询 x[_=#8~.1x
int c = ps.executeUpdate(); // 更新 ,~PYt*X4
OTWkUB{
3、处理执行结果 PG%0yv%
查询语句,返回记录集ResultSet XUMX*
更新语句,返回数字,表示该更新影响的记录数 dIweg=x
ResultSet的方法 "d/s5sP|S
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 5/><$06rq
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 gwkb!#A
^y.nDs%ZT7
4、释放连接 )>\}~s
cn.close(); `1` f*d
v
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 'vV$]/wBF
83~ i:+;
可滚动、更新的记录集 _mE^rT
1、创建可滚动、更新的Statement @`"AHt
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); |f( ~@Q:
该Statement取得的ResultSet就是可滚动的 mdih-u(T|
2、创建PreparedStatement时指定参数 v5ur&egVs
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); LE^G&<!
ResultSet.absolute(9000); e&q?}Ho
批量更新 ?^#lWx q
1、Statement KU9Z"9#
Statement sm = cn.createStatement(); vEe NW
sm.addBatch(sql1); ybdd;t}&1
sm.addBatch(sql2); #.B"q:CW*P
... )U<Y0bZA!
sm.executeBatch() 9a$56GnW1
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 SF]@|
2、PreparedStatement C&\5'[*
PreparedStatement ps = cn.preparedStatement(sql); "%2xR[NF
{ o/cjXun*
ps.setXXX(1,xxx); uZKP"Oy
... f2)XP$:
ps.addBatch(); (LAXM
x
} 0pe3L
ps.executeBatch(); L}{`h
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 1{"llD
iP~,n8W
事务的处理 Q'B6^%:<~
1、关闭Connection的自动提交 >"X\>M`"
cn.setAutoCommit(false); |Yi)"-
2、执行一系列sql语句 e59dVFug.U
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Mc sTe|X
Statement sm ; [(LV
sm = cn.createStatement(insert into user...); jLg@FDb~
sm.executeUpdate(); 92W&x'
sm.close(); yTM{|D]$(
sm = cn.createStatement("insert into corp...); ~o3Hdd_#}N
sm.executeUpdate(); d4[(8}
x$/
sm.close(); dmrps+L
3、提交 gA#RM5x@
cn.commit(); 6V9doP ]i
4、如果发生异常,那么回滚 K5Wg"^AHY/
cn.rollback();