java 数据库基本操作 ev7Y^
1、java数据库操作基本流程 a02@CsH
2、几个常用的重要技巧: M]oO1GM
可滚动、更新的记录集 }@_F( B
批量更新 BX;Z t9"*
事务处理 V)V\M6
m7Nm!Z7
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 NdZv*
1、取得数据库连接 RR<92R
1)用DriverManager取数据库连接
3#}5dO
例子 1Rc'2Y
String className,url,uid,pwd; yxh8sAZ
className = "oracle.jdbc.driver.OracleDriver"; 23BzD^2a
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; RR>Q$K
uid = "system"; Q9=X|
pwd = "manager"; xG@zy4
Class.forName(className); 8Ih+^Y
a
Connection cn = DriverManager.getConnection(url,uid,pwd); ^5x\cR
2)用jndi(java的命名和目录服务)方式 5rK7nLb
例子 (E )@@p7,:
String jndi = "jdbc/db"; NitWIj[U;
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ?NoG.
DataSource ds = (DataSource) ctx.lookup(jndi); }DjW
Connection cn = ds.getConnection(); g+|1khS)
多用于jsp中 _"%mLH=!8
2、执行sql语句 nm2bBX,fh
1)用Statement来执行sql语句 JK34pm[s
String sql; Hz&a~
Statement sm = cn.createStatement(); 42kr&UY&
sm.executeQuery(sql); // 执行数据查询语句(select) o Mk6ZzZ,>
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); *P]FX-D3
2)用PreparedStatement来执行sql语句 CqOvVv
String sql; 6 Ty;m>j
sql = "insert into user (id,name) values (?,?)"; 6O uB}*
PreparedStatement ps = cn.prepareStatement(sql); Li)rs<IX;m
ps.setInt(1,xxx); *f{\ze@5=
ps.setString(2,xxx); yU]NgG=z:-
... ?_*X\En*3
ResultSet rs = ps.executeQuery(); // 查询 &6V[@gmD
int c = ps.executeUpdate(); // 更新 'r3yFoP}
|tF:]jnIt
3、处理执行结果 #m[R1G#
查询语句,返回记录集ResultSet 2ZW
{
更新语句,返回数字,表示该更新影响的记录数 6V)P4ao
ResultSet的方法 L,6v!9@
1、next(),将游标往后移动一行,如果成功返回true;否则返回false .&fG_(6|
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 |Xz-rgkQ
C.`C T7
4、释放连接 Q'D%?Vg'
cn.close(); hq[;QF:B
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Ud@D%?A7
~.\CG'g
可滚动、更新的记录集 /Ilve
U`E
1、创建可滚动、更新的Statement WrJgU&H{
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); OI:G~Wg
该Statement取得的ResultSet就是可滚动的 5Us$.p
2、创建PreparedStatement时指定参数 H&0dc.n~.
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 5eS0
B{,c
ResultSet.absolute(9000); !C ]5_
批量更新 v;_m1UpuW
1、Statement aTXmF1_n
Statement sm = cn.createStatement(); iF0x>pvJ@
sm.addBatch(sql1); #_oN.1u57
sm.addBatch(sql2); oN3DM;
... ,6N|?<26O
sm.executeBatch() \M$e#^g
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有
rvPY
2、PreparedStatement |AD"}8
PreparedStatement ps = cn.preparedStatement(sql); {yj8LxX^
{ F_C7S
ps.setXXX(1,xxx); bxU 2.YC
... #GoZH?MAF
ps.addBatch(); ldFK3+V
} 4G ?Cu,$
ps.executeBatch(); ')G,+d^
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 } J_"/bB
K;uO<{a)r
事务的处理 u?Pec:3%
1、关闭Connection的自动提交 5B:%##Ug5
cn.setAutoCommit(false); 7dxe03h
2、执行一系列sql语句 :`jB1rI
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close %X|fp{C
Statement sm ; 10gh4,z[
sm = cn.createStatement(insert into user...); '.{tE*
sm.executeUpdate(); yzH(\ x
sm.close(); ;,WI_iP(w
sm = cn.createStatement("insert into corp...); Chso]N.1
sm.executeUpdate(); A-6><X's6
sm.close(); ^Kbq.4
3、提交 r]+/"~a
cn.commit(); !4Oj^yy%
4、如果发生异常,那么回滚 '?gF9:
cn.rollback();