java 数据库基本操作 5
Q/yPQN
1、java数据库操作基本流程 e'r-o~1eN
2、几个常用的重要技巧: UmG|_7
可滚动、更新的记录集 BbhC0q"J
批量更新 .yB{+
事务处理 RcOfesW
o
#U.6HBuQa
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 S=G2%u!;
1、取得数据库连接 1v 4M*
1)用DriverManager取数据库连接 f/t`B^}@
例子 )j. .)o
String className,url,uid,pwd; \|CuTb;0
className = "oracle.jdbc.driver.OracleDriver"; h)Ol1[y`
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; zBc |gx
uid = "system"; !o\e/HGc!
pwd = "manager"; !,R=6b$E5
Class.forName(className); RLfB]\w
Connection cn = DriverManager.getConnection(url,uid,pwd); >fzFNcO*
2)用jndi(java的命名和目录服务)方式 MqRJ:x
例子 DB(!*6#?
String jndi = "jdbc/db"; v^B2etiX_
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); p3V?n[/}
DataSource ds = (DataSource) ctx.lookup(jndi); 10^FfwRfM
Connection cn = ds.getConnection(); a#a n+JY3
多用于jsp中 5,?^SK|'x
2、执行sql语句 B`:l;<&jX
1)用Statement来执行sql语句 f o idneus
String sql; TQth"Cv2:
Statement sm = cn.createStatement(); cp6I]#X
sm.executeQuery(sql); // 执行数据查询语句(select) \-8aTF
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); O=oIkvg
2)用PreparedStatement来执行sql语句 . f!dH
String sql; L;v.X'f
sql = "insert into user (id,name) values (?,?)"; 51xf.iB
PreparedStatement ps = cn.prepareStatement(sql); |)S*RQb\
ps.setInt(1,xxx); .R)uk
ps.setString(2,xxx); 51;[R8'w
... ~SS3gL v
ResultSet rs = ps.executeQuery(); // 查询 q@1xYz:J
int c = ps.executeUpdate(); // 更新 <GLn!~Px@5
.-)kIFMi
3、处理执行结果 iXL?ic
查询语句,返回记录集ResultSet xNjWo*y v
更新语句,返回数字,表示该更新影响的记录数 ?C']R(fQ\
ResultSet的方法 +[}<u- -
1、next(),将游标往后移动一行,如果成功返回true;否则返回false
k; >Vh'=X
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 D4sp+
7"1]5\p^g
4、释放连接 nd&i9 l
cn.close(); Pbt7T
Q
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection IyAD>Q^
A9MTAm{
可滚动、更新的记录集 :*s@L2D6
1、创建可滚动、更新的Statement D 9UM8Hxi
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); U$;UW3-
该Statement取得的ResultSet就是可滚动的 -b|"%e<'
2、创建PreparedStatement时指定参数 R2JPLvs
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); J$lfI^^
ResultSet.absolute(9000); "28zLo3
批量更新 / }*}r
1、Statement k n/xt
Statement sm = cn.createStatement(); f~7V< v
sm.addBatch(sql1); k8r1)B4ab
sm.addBatch(sql2); RFX{]bQp9
... uW2 q\
sm.executeBatch() k5Su&e4]]
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 s6'=4gM
2、PreparedStatement d{"@<0i?
PreparedStatement ps = cn.preparedStatement(sql); '_5|9
}
{ RT${7=
ps.setXXX(1,xxx); o#=C[d5BV
... g>l+oH[Tv|
ps.addBatch(); P#D|CP/Cu
} v7\rW{~Jd&
ps.executeBatch(); wD4[UU?
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 2$v8{Y&
EWr7eH
事务的处理 0T^0)c
1、关闭Connection的自动提交 )?pnV":2Y
cn.setAutoCommit(false); UmY{2 nzY
2、执行一系列sql语句 Ks<+@.DLTu
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close k SgE_W)
Statement sm ; lQEsa45
sm = cn.createStatement(insert into user...); =T\=,B
sm.executeUpdate(); }kP<zvAaw
sm.close(); (][-()YV
sm = cn.createStatement("insert into corp...); x=+>J$~Pb
sm.executeUpdate(); xP/q[7>#Q
sm.close(); g@T}h[
3、提交 #2Iag'4T
cn.commit(); SPXvi0Jg
4、如果发生异常,那么回滚 K$w;|UJc
cn.rollback();