java 数据库基本操作 iC#a+G*N_M
1、java数据库操作基本流程
3f`Uoh+
2、几个常用的重要技巧: n{?Du
可滚动、更新的记录集 3r~8:F"g
批量更新 (JbRhcg
事务处理 +6WjOcu
dn h qg3Y
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 .\b.l@O<Z
1、取得数据库连接 b `P6Ox3
1)用DriverManager取数据库连接 jJ2rfdfj
例子 6()Jx%
String className,url,uid,pwd; !X}+JeU'
className = "oracle.jdbc.driver.OracleDriver"; G#7*O`
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; $O |Xq7dp
uid = "system"; #un'?]tZF
pwd = "manager"; &* VhtT?=5
Class.forName(className); >!fTWdD^
Connection cn = DriverManager.getConnection(url,uid,pwd); B&MDn']fV/
2)用jndi(java的命名和目录服务)方式 W? G4>zA
例子 J_)F/S!T
String jndi = "jdbc/db"; !XTzsN
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); #VhdYDbW
DataSource ds = (DataSource) ctx.lookup(jndi); y;az&T
Connection cn = ds.getConnection(); q,[;AHb
多用于jsp中 \n}%RD-Ce
2、执行sql语句 ,LBj$U]e|E
1)用Statement来执行sql语句 9O- otAGM
String sql; 8$uq60JK
Statement sm = cn.createStatement(); qjRbsD>
sm.executeQuery(sql); // 执行数据查询语句(select) g0 Q,]\~
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); iZ]^JPU}
2)用PreparedStatement来执行sql语句 rO}1E<g
(
String sql; %p\~
sql = "insert into user (id,name) values (?,?)"; Aw7N'0K9UN
PreparedStatement ps = cn.prepareStatement(sql); $?ss5:
S
ps.setInt(1,xxx); ?8753{wk
ps.setString(2,xxx); %g?M?D8Ud3
... v}!lx)#
ResultSet rs = ps.executeQuery(); // 查询 61_PSScSY
int c = ps.executeUpdate(); // 更新 Ja1 `S+
`@y~ JNf!
3、处理执行结果 TFHYB9vV
查询语句,返回记录集ResultSet @kSfF[4H
更新语句,返回数字,表示该更新影响的记录数 .nY}_&
ResultSet的方法 K-'uE)
1、next(),将游标往后移动一行,如果成功返回true;否则返回false D&fOZVuqZ
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 >FeCa
hFn
56Lxr{+X
4、释放连接 !~zn*Hm
cn.close(); O
C;~ H{
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection LDegJer-v
o"qxR'V
可滚动、更新的记录集 O=K0KOj
1、创建可滚动、更新的Statement \>\ERVEd
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); z&9ljQ
iF
该Statement取得的ResultSet就是可滚动的 whN<{AG
2、创建PreparedStatement时指定参数 >JNdtP8s/1
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); CL7_3^2qI
ResultSet.absolute(9000); \6AM?}v
批量更新 rX^uHq8
1、Statement N(i.E5&9
Statement sm = cn.createStatement(); C#[P<= v
sm.addBatch(sql1); vAP1PQX;
sm.addBatch(sql2); b|V<Kp
... &am<_Tn*3
sm.executeBatch() fx>QP?Z
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 1TEKq#t;y
2、PreparedStatement }se3y
PreparedStatement ps = cn.preparedStatement(sql); |7K>`
{ wKJ|;o4;L
ps.setXXX(1,xxx); _ow7E\70
... \E c*Gq?.
ps.addBatch(); n:a~=^IV
} MHp:".1
ps.executeBatch(); A p zC
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 _rSwQ<38>
WXo bh
事务的处理 5ms]Wbh)
1、关闭Connection的自动提交 +L=Xc^
cn.setAutoCommit(false); E
6#/@C,
2、执行一系列sql语句 md bi@ms@
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close BJ_"FG
Statement sm ; jcC"vr'u|
sm = cn.createStatement(insert into user...); ) M8,Tv*~
sm.executeUpdate(); zv"NbN
sm.close(); SWtqp(h]'
sm = cn.createStatement("insert into corp...); Xtz29
sm.executeUpdate(); mCn:{G8+
sm.close(); .Tl,Ek(
3、提交 ~zZOogM<
cn.commit(); NVQ.;" 2w
4、如果发生异常,那么回滚 Ze/\IBd
cn.rollback();