java 数据库基本操作 $
% B
1、java数据库操作基本流程 UXwI?2L
2、几个常用的重要技巧: f>&*%[fw
可滚动、更新的记录集 *<}R=X.
批量更新 46B'Ec
事务处理 "_=t1UE
bXqTc2>=
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 7`^=Ie%(K
1、取得数据库连接 +I}!)$/
1)用DriverManager取数据库连接 8>xd
例子 p1T0FBV
L
String className,url,uid,pwd; %MCS_'N
J
className = "oracle.jdbc.driver.OracleDriver"; >\3N#S"PF
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; j9-.bGtm?.
uid = "system"; ;hh.w??
pwd = "manager"; AOz~@i^
Class.forName(className); +4Q1s?`
Connection cn = DriverManager.getConnection(url,uid,pwd); pOj8-rr
2)用jndi(java的命名和目录服务)方式 CBz=-Xr
例子 S,a:H*Hf
String jndi = "jdbc/db"; kxmsrQ>av
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); tJGK9!MH{(
DataSource ds = (DataSource) ctx.lookup(jndi); {s6hi#R>
Connection cn = ds.getConnection(); }%^ 3
多用于jsp中 JbN,K
2、执行sql语句 f'BmIFb#
1)用Statement来执行sql语句 \6pQ&an
String sql; Gh<#wa['}
Statement sm = cn.createStatement(); #F6M<V'
sm.executeQuery(sql); // 执行数据查询语句(select) [jGE{<Je
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); @4Q/J$
2)用PreparedStatement来执行sql语句 (UTA3Db
String sql; WmRu3O
sql = "insert into user (id,name) values (?,?)"; IGlM}
?x
PreparedStatement ps = cn.prepareStatement(sql); }Nma %6PfV
ps.setInt(1,xxx); M'T[L%AP
ps.setString(2,xxx); 5v sn'=yN
... 'aS: Azb
ResultSet rs = ps.executeQuery(); // 查询 V >~\~H2Y
int c = ps.executeUpdate(); // 更新 ^S)t;t@x
7ZUS
3、处理执行结果 m\_v{1g
查询语句,返回记录集ResultSet p<y\^a
更新语句,返回数字,表示该更新影响的记录数 RcZ&/MY
ResultSet的方法 vYq"W%
1、next(),将游标往后移动一行,如果成功返回true;否则返回false kovJ9
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 pIKfTkSqH
E
`V?Io
4、释放连接 >4Qj+ou
cn.close(); \VypkbE+
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection PO|gM8E1x?
cE?p~fq<
可滚动、更新的记录集 r[#*..Y
1、创建可滚动、更新的Statement 6=*n$l#}
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); jHV)
TBr
该Statement取得的ResultSet就是可滚动的 dl6Ju
2、创建PreparedStatement时指定参数 f=Oj01Ut*
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); .\3gb6S}
ResultSet.absolute(9000); ~K
('t9|
批量更新 t Q.%f:|
1、Statement +F>erdV
Statement sm = cn.createStatement(); Z@AN0?,`~o
sm.addBatch(sql1); 7Jpq7;
sm.addBatch(sql2); AE Abny
q
... V@\u<LO0G
sm.executeBatch() c<{~j~+
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 R'oGsaPB2
2、PreparedStatement `X B$t?xi
PreparedStatement ps = cn.preparedStatement(sql); [}}q/7Lp
{ sWi4+PAM0
ps.setXXX(1,xxx); 6.a|w}C`
... z+^9)wg9
ps.addBatch(); `9A`pC
} <X?xr f
ps.executeBatch(); CX;
m8
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 H;+98AIy`
48{B} j%oU
事务的处理 5fLp?`T
1、关闭Connection的自动提交 n'1LNi
cn.setAutoCommit(false); c2]h.G83
2、执行一系列sql语句 l-SVI9|<0
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 4y$okn\}i
Statement sm ; |lyspD
sm = cn.createStatement(insert into user...); ?`75ah
sm.executeUpdate(); (@=h(u .
sm.close(); %UG|R:
sm = cn.createStatement("insert into corp...); *9`k$'
sm.executeUpdate(); 3~LNz8Z*
sm.close(); G)gb5VW k
3、提交 aFL<(,~r
cn.commit(); o<5+v^mt#
4、如果发生异常,那么回滚 'L^M"f^I
cn.rollback();