java 数据库基本操作 9y7hJib
1、java数据库操作基本流程 ;>7~@
K
2、几个常用的重要技巧: 5J`w8[;
可滚动、更新的记录集 Q9cSrU[$
批量更新 zYaFbNi
事务处理 M
%,\2!$
P.Tnq
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 sO) H#G
1、取得数据库连接 yq.@-]ytZ
1)用DriverManager取数据库连接 QuS=^,]
例子 )L&y@dy)
String className,url,uid,pwd; B9"d7E#wHF
className = "oracle.jdbc.driver.OracleDriver"; 4]1/{</B|
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ZW?h\0Hh
uid = "system"; J;>;K6pW
pwd = "manager"; JcRxNH
)<"
Class.forName(className); B6F!"
Connection cn = DriverManager.getConnection(url,uid,pwd); ;C-ds
2)用jndi(java的命名和目录服务)方式 T4W20dxL7
例子 ,xU#uyB
String jndi = "jdbc/db"; rZ,qHM
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); /[ m7~B]QE
DataSource ds = (DataSource) ctx.lookup(jndi); OX.5olb
Connection cn = ds.getConnection(); uyEk1)HC
多用于jsp中 e_!h>=$%8
2、执行sql语句 9(fh+
1)用Statement来执行sql语句 t!wbT79/
String sql; >yc),]1~
Statement sm = cn.createStatement(); Vw;iE=L
sm.executeQuery(sql); // 执行数据查询语句(select) f IV"U
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); fKEDe>B5
2)用PreparedStatement来执行sql语句 <]?71{7X
String sql; 'sAkrl8kt
sql = "insert into user (id,name) values (?,?)"; JAHmmNlW
PreparedStatement ps = cn.prepareStatement(sql); Q:)4
ps.setInt(1,xxx); *
0K]/tn<
ps.setString(2,xxx); ();Z,A
... %o9mG<.T
ResultSet rs = ps.executeQuery(); // 查询 iM!V4Wih6
int c = ps.executeUpdate(); // 更新 "u^2!d
&=t~_ Dc
3、处理执行结果 =_&,^h@'3e
查询语句,返回记录集ResultSet ~~Cd9Hzi
更新语句,返回数字,表示该更新影响的记录数 #}.{|'L
ResultSet的方法 )2"WC\%
1、next(),将游标往后移动一行,如果成功返回true;否则返回false @}jg5}
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ^XyC[ G@[
"LYhYkI
4、释放连接 0Runex[
cn.close(); {B=64,D^7R
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ral=`/p
tM@%EO
可滚动、更新的记录集 Y".?j5f?
1、创建可滚动、更新的Statement FM3.z)>
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Bph(\=
W
该Statement取得的ResultSet就是可滚动的 6jMc|he
2、创建PreparedStatement时指定参数 a@|`!<5
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); F6{
O
ResultSet.absolute(9000); Dt5AG
批量更新 aIT0t0.
1、Statement @6_w{6:b
Statement sm = cn.createStatement(); W;Dik%^tg
sm.addBatch(sql1); Z>`frL
sm.addBatch(sql2); 9XUYy2{G
... y[f%0*\B
sm.executeBatch() {2xc/
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 0I)eYksh
2、PreparedStatement ko!]vHB9`
PreparedStatement ps = cn.preparedStatement(sql); c ~M'O26bW
{ H5vg s2R
ps.setXXX(1,xxx); $XyDw|z[
... O?#<kmd/)
ps.addBatch(); JWM4S4yZHR
} m,5m'9dj
ps.executeBatch(); 1jK2*y
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 |v>W
"2!5g )iO
事务的处理 L.9@rwfI
1、关闭Connection的自动提交 4\U"e*
cn.setAutoCommit(false); 7Or?$
2、执行一系列sql语句 \J~@r1
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close u~t% GIg
Statement sm ; HlxgJw~<
sm = cn.createStatement(insert into user...); Q9X+H4`}y
sm.executeUpdate(); h ^zcM_
sm.close(); NmNj0&
sm = cn.createStatement("insert into corp...); )\e0L/K@
sm.executeUpdate(); 2j^8{Agz
sm.close(); O8*yho
3、提交 _Pw5n
mH c
cn.commit(); /GP:W6:6z6
4、如果发生异常,那么回滚 FYaBP;@J%
cn.rollback();