java 数据库基本操作 >}bkX
6c5
1、java数据库操作基本流程 1@N4Y9o
2、几个常用的重要技巧: BXNC(^
可滚动、更新的记录集 bw)E;1zo
批量更新 =)#<u9
qqL
事务处理 Mr*CJgy
SBaTbY0
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 dUBf.2ry
1、取得数据库连接 cj4o[l
1)用DriverManager取数据库连接 wHZ(=z/q
例子 kT % m`
String className,url,uid,pwd; [s+FX5' K
className = "oracle.jdbc.driver.OracleDriver"; :j#zn~7
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; *Z+U}QhHD6
uid = "system";
,
{}S<^?]
pwd = "manager"; |kF"p~s
Class.forName(className); 5s%FHa
Connection cn = DriverManager.getConnection(url,uid,pwd); 8.&P4u i
2)用jndi(java的命名和目录服务)方式 /!_FE+
例子 =eR#]d
String jndi = "jdbc/db"; .zy2_3:
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); /uPMzl
DataSource ds = (DataSource) ctx.lookup(jndi); v+i==vxg
Connection cn = ds.getConnection(); ?k=)T]-}
多用于jsp中 YkQ=rurE
2、执行sql语句 'JO}6
;W
1)用Statement来执行sql语句 |fb*<o eT
String sql; y#P_ }Kfo
Statement sm = cn.createStatement(); E*yot[kj
sm.executeQuery(sql); // 执行数据查询语句(select) k!T-X2L=
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); g2vt(Gf ;
2)用PreparedStatement来执行sql语句 mC$ te
String sql; *l@T
9L[M'
sql = "insert into user (id,name) values (?,?)"; Odm1;\=Eg+
PreparedStatement ps = cn.prepareStatement(sql); rcf#8
ps.setInt(1,xxx); VrKLEN\
ps.setString(2,xxx); MH]?:]K9V
... "HLh3L~
ResultSet rs = ps.executeQuery(); // 查询 5>:p'zI
int c = ps.executeUpdate(); // 更新 uG/b Cb+V
KkJE-k*D+w
3、处理执行结果 ug/P>0
查询语句,返回记录集ResultSet Ko!a`I2M}
更新语句,返回数字,表示该更新影响的记录数 %C)|fDwN
ResultSet的方法 ;[7#h8
1、next(),将游标往后移动一行,如果成功返回true;否则返回false cef:>>6_
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 'N&s$XB,
F)50 6
4、释放连接 @sRb1+nn
cn.close(); ?i\$U'2*z3
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection }5d|y*
"/x/]Qx2
可滚动、更新的记录集 Of
nN
1、创建可滚动、更新的Statement Kww+lgzS
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); m[w~h\FS
该Statement取得的ResultSet就是可滚动的 :UfaMe5
2、创建PreparedStatement时指定参数 V.!z9AQ
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ioslarw1J
ResultSet.absolute(9000); }]pO R&o
批量更新 0Rn`63#
1、Statement t&C0V|s79$
Statement sm = cn.createStatement(); m xy=3cUi
sm.addBatch(sql1); G[ q<P
sm.addBatch(sql2); '<wZe.Q!
... kqCUr|M.P
sm.executeBatch() CelM~W$=u
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 5(DnE?}vo
2、PreparedStatement O_D;_v6Ii+
PreparedStatement ps = cn.preparedStatement(sql); _z3^.QP
{ [5]*
Be
ps.setXXX(1,xxx); K&&YxX~3
... ]2z
Gb5s"
ps.addBatch(); g:>dF#
} K14{c1
ps.executeBatch(); xQ=L2pX
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ,f
.#-
kCKCJ}N
事务的处理 VKr
oikz@]
1、关闭Connection的自动提交 &RlYw#*1.
cn.setAutoCommit(false); 8yGo\\=T
2、执行一系列sql语句 aVn+@g<.
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close {z# W-
Statement sm ; (k %0|%eR
sm = cn.createStatement(insert into user...); a]x\e{
sm.executeUpdate(); Csm23QLsg)
sm.close(); cV* 0+5
sm = cn.createStatement("insert into corp...); :5zO!~\
sm.executeUpdate(); C2?p>S/q
sm.close(); h-@_.&P0e
3、提交 z"!=A}i
cn.commit(); B 3eNvUFZg
4、如果发生异常,那么回滚 s`L>mRw`
cn.rollback();