java 数据库基本操作 1czG55 |
1、java数据库操作基本流程 9rj('F&1
2、几个常用的重要技巧: =xEk7'W6k
可滚动、更新的记录集 cV$lobqO
批量更新 f==*"?6\
事务处理 R $b,h
$"fo^?d/s
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 q
G;-o)h
1、取得数据库连接 \v`#|lT$
1)用DriverManager取数据库连接 |paP<$
例子 `\FI7s3b
String className,url,uid,pwd; . A<sr
className = "oracle.jdbc.driver.OracleDriver"; +80 2`eax
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; iV)ac\
uid = "system"; |Mg }2!/L
pwd = "manager"; 6zYaA
Class.forName(className); (:?&G9k
"
Connection cn = DriverManager.getConnection(url,uid,pwd); 'tWAu I
2)用jndi(java的命名和目录服务)方式 SfI*bJo>V
例子 9G:TW|)L[Q
String jndi = "jdbc/db"; 'XfgBJF=
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); *m_93J
DataSource ds = (DataSource) ctx.lookup(jndi); Fn,k!q
Connection cn = ds.getConnection(); vnsSy 33K
多用于jsp中 wkT;a&_
2、执行sql语句 J9@}DB
1)用Statement来执行sql语句 5gNLO\
String sql; !P|5#.eC
Statement sm = cn.createStatement(); IhW7^(p\
sm.executeQuery(sql); // 执行数据查询语句(select) D3?N<9g
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Qyj(L[K J
2)用PreparedStatement来执行sql语句 .w'vD/q;
String sql; R`He^
sql = "insert into user (id,name) values (?,?)";
&tBA^igXK
PreparedStatement ps = cn.prepareStatement(sql); R<&FhT]
ps.setInt(1,xxx); $Xt;A&l2?
ps.setString(2,xxx); KSOO?X0j
... u( 9X
ResultSet rs = ps.executeQuery(); // 查询 UD*+"~
int c = ps.executeUpdate(); // 更新 >~&(P_<b
EhXiv#CZ
3、处理执行结果 e{t=>vry
查询语句,返回记录集ResultSet _W9&J&l0so
更新语句,返回数字,表示该更新影响的记录数 rbh[j@s@
ResultSet的方法 zUQe0Gc.b^
1、next(),将游标往后移动一行,如果成功返回true;否则返回false qz:]-A
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 A[9NP-~
a;&}zcc*
4、释放连接 fOW_h
cn.close(); ??I:H
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection jaqV[*440U
6$z'wy/*
可滚动、更新的记录集 4g!7
4a
1、创建可滚动、更新的Statement F!R2_89iy
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); n#>5?W
该Statement取得的ResultSet就是可滚动的 `cO|RhD@
2、创建PreparedStatement时指定参数 *aG"+c6|
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); *:#Z+7x
]
ResultSet.absolute(9000); Qu}N:P9l?X
批量更新 h2&y<Eg >
1、Statement Vi,Y@+4
Statement sm = cn.createStatement(); "UpOY
sm.addBatch(sql1); ,eK2I Ao
sm.addBatch(sql2); q2Rf@nt
... j)Lo'&Y~=
sm.executeBatch() ;@!;1KDy
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 )d_U)b7i
2、PreparedStatement #01/(:7
PreparedStatement ps = cn.preparedStatement(sql); #ko6L3Pi
{ W gZ@N
ps.setXXX(1,xxx); ".M:`BoW4
... 28+HKbgK
ps.addBatch(); lbofF==(
} z`@z
ps.executeBatch(); !OQuEJR
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 EOQaY
+I.v!P!^
事务的处理 FoLDMx(
1、关闭Connection的自动提交 R_9 o!sTZ
cn.setAutoCommit(false); =SL^>HS.fo
2、执行一系列sql语句 LT&/0
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close JilKZQmk
Statement sm ; Re\o
v x9
sm = cn.createStatement(insert into user...); GDmv0V$6
sm.executeUpdate(); W+/2c4$F3
sm.close(); h.D^1
sm = cn.createStatement("insert into corp...); 0/*X=5
sm.executeUpdate(); CwB] )QV?
sm.close(); 43F^J%G
3、提交 EGEMZCdk2
cn.commit(); `=v@i9cTZ
4、如果发生异常,那么回滚 DZ%8 |PmB
cn.rollback();