java 数据库基本操作 s}JifY`
1、java数据库操作基本流程 yBK$2to~
2、几个常用的重要技巧: Y6wr}U
可滚动、更新的记录集 QFTiE1mGH
批量更新 .BxI~d^
事务处理 KXMf2)pa
W~H`{x%Av>
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 p;4FZ$
1、取得数据库连接 1
F:bExQ
1)用DriverManager取数据库连接 @+;.W>^h
例子 5kqI
String className,url,uid,pwd; 2Ys=/mh
className = "oracle.jdbc.driver.OracleDriver"; Z +/3rd
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; (bm>
)U=
uid = "system"; l_k:OZ
pwd = "manager"; q?frt3o
Class.forName(className); [(
xPX
Connection cn = DriverManager.getConnection(url,uid,pwd); pI f6RwH}%
2)用jndi(java的命名和目录服务)方式 )4fQ~)
例子 b!t[PShw^
String jndi = "jdbc/db"; 7 @\i5
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); RA a1^Qb
DataSource ds = (DataSource) ctx.lookup(jndi); /y1+aTiJ
Connection cn = ds.getConnection(); 5XT^K)'
多用于jsp中 (x%
4*
2、执行sql语句 v$\<L|
1)用Statement来执行sql语句 jhRr!
String sql; S9DXd]6q_
Statement sm = cn.createStatement(); !4v>|t q!
sm.executeQuery(sql); // 执行数据查询语句(select) (e_<~+E
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); #n&/v'!\
2)用PreparedStatement来执行sql语句 @|h9jx|
String sql; XFTqt]
sql = "insert into user (id,name) values (?,?)"; U8aVI
PreparedStatement ps = cn.prepareStatement(sql); BN(=LQ2["
ps.setInt(1,xxx); #P!<u Lc%
ps.setString(2,xxx); P,zQl;
... o]V.6Ge-
ResultSet rs = ps.executeQuery(); // 查询 KKQT?/ {b
int c = ps.executeUpdate(); // 更新 ElTB{C>u
NxA4*_|H9
3、处理执行结果 nGX3_-U4
查询语句,返回记录集ResultSet ;4dFL\KU
更新语句,返回数字,表示该更新影响的记录数 (z;lNl(*C
ResultSet的方法 ;d>n2
1、next(),将游标往后移动一行,如果成功返回true;否则返回false pC,Z=+:
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 YeT{<9p
";Cf@}i>
4、释放连接 ^?]-Q*w3Qs
cn.close(); Z[&FIG%tV
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection bD/ZKvg
o6w8Y/VPu
可滚动、更新的记录集 "N'W~XPG
1、创建可滚动、更新的Statement Q%~BD@Io
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); rF}Q(<Y86
该Statement取得的ResultSet就是可滚动的 )^P54_2
2、创建PreparedStatement时指定参数 s%rmfIp"
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 2 Y9u9;ah
ResultSet.absolute(9000); bLWY Tj
批量更新 #?\(l%
1、Statement ->OVNmCB`+
Statement sm = cn.createStatement(); :!cK?H$+
sm.addBatch(sql1); ]jI<Js*F
sm.addBatch(sql2); og8hc~:ro
... J9;fqQCt
sm.executeBatch() g/68&
M
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 y:Gn58\o
2、PreparedStatement y5*zyd
PreparedStatement ps = cn.preparedStatement(sql); .>r3ZwrE'
{ &ID! lEd
ps.setXXX(1,xxx); zICCSF&H
... Vp1ct06^
ps.addBatch(); 4 7mT
} RiAMW|M"C
ps.executeBatch(); IYtiX
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 a {x3FQ
DC/Czkv9
事务的处理 LibQlNW\
1、关闭Connection的自动提交 \K"7U
cn.setAutoCommit(false); i?b9zn
2、执行一系列sql语句 6&;GC<].(y
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close S"?fa)~
Statement sm ; ?[.8A/:5
sm = cn.createStatement(insert into user...); u23_*W\
sm.executeUpdate(); J2
)h":2
sm.close(); h*40jZ
sm = cn.createStatement("insert into corp...); N.q*jY=X|
sm.executeUpdate(); .`_iWfK
sm.close(); ~Gh7i>n*
3、提交 hi$AZ+
cn.commit(); R{Zd ]HT
4、如果发生异常,那么回滚 cNwHY
Z'
cn.rollback();