java 数据库基本操作
Zv1/J}+
1、java数据库操作基本流程 ;ZLfb n3\
2、几个常用的重要技巧: IQ}YF]I;
可滚动、更新的记录集 FkIT/H
批量更新 4}=Z+tDu>
事务处理 []eZO_o6j
_;5N@2?
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 9RN! <`H
1、取得数据库连接 2Y{r2m|o
1)用DriverManager取数据库连接 _M}}H3
例子
|/p2DU2
String className,url,uid,pwd; '4d+!%2t
className = "oracle.jdbc.driver.OracleDriver"; q1o)l
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; u'EzYJ7
uid = "system"; ~bk+JK- >
pwd = "manager"; W(UrG]J*l
Class.forName(className); #_OrS/H
Connection cn = DriverManager.getConnection(url,uid,pwd); |zSoA=7?
2)用jndi(java的命名和目录服务)方式 <D M:YWNa
例子 i/WiSwh:
String jndi = "jdbc/db"; lilF _y
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); GGwHz]1L
DataSource ds = (DataSource) ctx.lookup(jndi); be{t yV
Connection cn = ds.getConnection(); *+'l|VaVq\
多用于jsp中 .1& F p
2、执行sql语句 0(dXU\Y
1)用Statement来执行sql语句 ns1@=f cO
String sql; n*fsdo~
Statement sm = cn.createStatement(); ,;wc$-Z!8
sm.executeQuery(sql); // 执行数据查询语句(select) f)K1j{TZ
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); q'awV5y
2)用PreparedStatement来执行sql语句 E#cZM>
String sql; .9;wJ9Bw[
sql = "insert into user (id,name) values (?,?)"; .EQ1r7
9,
PreparedStatement ps = cn.prepareStatement(sql); k%?A=h
ps.setInt(1,xxx); eMC0
)B
ps.setString(2,xxx); %]i("21
... u9%)_Q!14
ResultSet rs = ps.executeQuery(); // 查询 >T~duwS
int c = ps.executeUpdate(); // 更新 -( ,iwFb
VWa;;?IK
3、处理执行结果 JmK[7t
查询语句,返回记录集ResultSet BPzlt
更新语句,返回数字,表示该更新影响的记录数 -%x9^oQwY
ResultSet的方法 14v,z;HXj
1、next(),将游标往后移动一行,如果成功返回true;否则返回false
=:-x;
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 YV0K&d
bfjtNF*^
4、释放连接 *z
A1 NH5
cn.close(); S7
Tem:/
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 2r=A'
FO5'<G-
可滚动、更新的记录集 !EQMTF=(
1、创建可滚动、更新的Statement +b]+5!
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); <+c6CM$#}V
该Statement取得的ResultSet就是可滚动的 7&z`N^dz{
2、创建PreparedStatement时指定参数 "ewB4F[
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 9>"To
ResultSet.absolute(9000); kdrya
批量更新 M%8:
1、Statement 5#U*vGVT
Statement sm = cn.createStatement(); UF00K1dbz
sm.addBatch(sql1); ,HQaS9vBQ
sm.addBatch(sql2); 0vRug|}k#%
... aGz<Yip
sm.executeBatch() qrmJJSJ
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 <ZM8*bqi
2、PreparedStatement = ,=t Sp
PreparedStatement ps = cn.preparedStatement(sql); }TCOm_Y/qL
{ n3kYVAgF
ps.setXXX(1,xxx); M6J/S
... CL$mK5u
ps.addBatch(); :A{ US9D
} |H4/a;]~
ps.executeBatch(); \;>idbV
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 &v^LxLt+s
E}$K&<J'-
事务的处理 -l!;PV S|
1、关闭Connection的自动提交 QDC]g.x
cn.setAutoCommit(false); >Cjb|f3'i}
2、执行一系列sql语句 W%=b|6E
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close T?+xx^wYk
Statement sm ; vO)nqtw
sm = cn.createStatement(insert into user...); sc!
e$@U
sm.executeUpdate(); v*nX
sm.close(); E30VKh |
sm = cn.createStatement("insert into corp...); J!:ss
sm.executeUpdate(); Iz#h:O
sm.close(); (Js'(tBhiU
3、提交 >_y>["u6J#
cn.commit(); 7='M&Za
4、如果发生异常,那么回滚 U9KnW]O%"
cn.rollback();