java 数据库基本操作 $iy(+}
1、java数据库操作基本流程 R'1"`@fG
2、几个常用的重要技巧: v<} $d.&*
可滚动、更新的记录集 :d~&Dt<c
批量更新 G)5Uiu:^X
事务处理 xNVSWi,
Iak06E
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 RoD9
1、取得数据库连接 T6,6lll
1)用DriverManager取数据库连接 U%2{PbL
例子 :rmi8!o
String className,url,uid,pwd; n{F&GE="
className = "oracle.jdbc.driver.OracleDriver"; ^\PNjj*C i
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; y*sqnzgF
uid = "system"; 49#?I:l
pwd = "manager";
PurY_
Class.forName(className); -uK@2}NZ
Connection cn = DriverManager.getConnection(url,uid,pwd); ;xE1#ZT
2)用jndi(java的命名和目录服务)方式 iEBxBsz_
例子 zL:k(7E
String jndi = "jdbc/db"; u z>V
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); k:E+]5
DataSource ds = (DataSource) ctx.lookup(jndi); Luh*+l-nO
Connection cn = ds.getConnection(); 62xAS#\K>
多用于jsp中 SL%
Ec%9Y
2、执行sql语句 cy_zEJjbD
1)用Statement来执行sql语句 +?[iB"F
String sql; u&Y1,:hiL
Statement sm = cn.createStatement(); ^$\#aTyFK
sm.executeQuery(sql); // 执行数据查询语句(select) (<5&<JC{
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); N%8aLD
2)用PreparedStatement来执行sql语句 ZltY_5l
String sql; BO=j*.YKy
sql = "insert into user (id,name) values (?,?)"; 8J#TP7;
PreparedStatement ps = cn.prepareStatement(sql); 2k""/xMF'
ps.setInt(1,xxx); Z|Xv_Xo|4
ps.setString(2,xxx); 4}=Z+tDu>
... h|&qWv
ResultSet rs = ps.executeQuery(); // 查询 _;5N@2?
int c = ps.executeUpdate(); // 更新 a{8g9a4
4EEXt<c.
3、处理执行结果 /H[ !v:U
查询语句,返回记录集ResultSet V\><6v
更新语句,返回数字,表示该更新影响的记录数 c`G~.paY|
ResultSet的方法 )SFyQ
1、next(),将游标往后移动一行,如果成功返回true;否则返回false FZhjI 8+,~
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 lilF _y
qw%wyj7
4、释放连接 H;eOrX{GT
cn.close(); })@LvYK
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Ni 5Su
5;-?qcb^w
可滚动、更新的记录集 d#G H4+C
1、创建可滚动、更新的Statement |G]M"3^
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); .EQ1r7
9,
该Statement取得的ResultSet就是可滚动的 ? v2JuhRe
2、创建PreparedStatement时指定参数 QZ51}i
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); >T~duwS
ResultSet.absolute(9000); Arb-,[kwN
批量更新 5hbQUF
,Q
1、Statement kUG3_ *1
.
Statement sm = cn.createStatement(); oVSq#I4
sm.addBatch(sql1); x,SzZ)l-9
sm.addBatch(sql2); #/Qe7:l
... 7 V+rQ
sm.executeBatch() FO5'<G-
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 wmr8[n&c
2、PreparedStatement <+c6CM$#}V
PreparedStatement ps = cn.preparedStatement(sql); .AgD`wba
{ 9>"To
ps.setXXX(1,xxx); RGim):1e
... 4h[^!up.7
ps.addBatch(); (7g1eEK%
} "xV9$m>
ps.executeBatch(); J<{@D9r9<~
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 <ZM8*bqi
-]h3s
>t
事务的处理 IuQY~!
1、关闭Connection的自动提交 Vi~F
Q
cn.setAutoCommit(false); iE$/ Rcp
2、执行一系列sql语句 U\ A*${
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close \;>idbV
Statement sm ; S?5z
sm = cn.createStatement(insert into user...); .{1MM8 Q
sm.executeUpdate(); >Cjb|f3'i}
sm.close(); H+>l][
sm = cn.createStatement("insert into corp...); huau(s0um
sm.executeUpdate(); Y`u.P(7#
sm.close(); \5%T'S@5
3、提交 v?7.)2XcX
cn.commit(); o|nj2 .
4、如果发生异常,那么回滚 .hCOi<wB
cn.rollback();