java 数据库基本操作 }j_2K1NS{
1、java数据库操作基本流程 PL}c1Ud
2、几个常用的重要技巧: W74Y.zQ
可滚动、更新的记录集 M];?W
批量更新 N}/|B}
事务处理 #J):N
"{@Q..hxC
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 )
u(Gf*t
1、取得数据库连接 [d3i_^\
1)用DriverManager取数据库连接 ^{m&2l&87
例子 h8)m2KrZ!.
String className,url,uid,pwd; xis],.N
className = "oracle.jdbc.driver.OracleDriver"; JK/VIu&!
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; }iE!(
l
uid = "system"; w{$X
:Z
pwd = "manager"; ';>A=m9(4%
Class.forName(className); o]jPG
Connection cn = DriverManager.getConnection(url,uid,pwd); +5k^-
2)用jndi(java的命名和目录服务)方式 |Q\O%
cb
例子 VUF$,F9
String jndi = "jdbc/db"; h't!1u
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 4[P]+Z5b+
DataSource ds = (DataSource) ctx.lookup(jndi); j]X$7
Connection cn = ds.getConnection(); tEbR/?,GI
多用于jsp中 ~TvKMW6/#
2、执行sql语句 MJ..' $>TC
1)用Statement来执行sql语句 6A;,Ph2
String sql; VHbQLJ0
Statement sm = cn.createStatement(); N,?4,+Hc-
sm.executeQuery(sql); // 执行数据查询语句(select) Pf/_lBtL
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); >69- [#P!
2)用PreparedStatement来执行sql语句 D00v"yp%%
String sql; K
K_
sql = "insert into user (id,name) values (?,?)"; %0MvCm
PreparedStatement ps = cn.prepareStatement(sql); G oHdhne3
ps.setInt(1,xxx); +;|" #
ps.setString(2,xxx); |vUjoa'.7E
... v&]k8Hc-
ResultSet rs = ps.executeQuery(); // 查询 ~5@bWJ
int c = ps.executeUpdate(); // 更新 O`rKxP
m5'nqy F
3、处理执行结果 m(0c|-
查询语句,返回记录集ResultSet +~{Honj[
更新语句,返回数字,表示该更新影响的记录数 d>wpG^"w
ResultSet的方法 u6lcl}'
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 9!u&8#i
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 =K:)%Qh
~_GW
4、释放连接 z,+LPr
cn.close(); R<eD)+
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection M}Obvl
)&F]j
可滚动、更新的记录集 5 >c,#*
1、创建可滚动、更新的Statement W3M1> (
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY);
5B)z}g^h
该Statement取得的ResultSet就是可滚动的 a@v}j&
2、创建PreparedStatement时指定参数
O>tz;RU
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ,"xr^@W
ResultSet.absolute(9000); V\6V&_
批量更新 ,l )7]p*X
1、Statement CEXD0+\q
Statement sm = cn.createStatement(); ar[I|
Q_
sm.addBatch(sql1); =g3o@WD/G
sm.addBatch(sql2); Py^fWQ5I~%
... +v{g'
sm.executeBatch() |J^}BXW'^)
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 wOLA8UYW
2、PreparedStatement ^NB\[ &
PreparedStatement ps = cn.preparedStatement(sql); R[vA%G
{ - xE%`X
ps.setXXX(1,xxx); 7mBH#Q)
... g=)OcTd#
ps.addBatch(); ZT
d)4f
} b uOpHQn
ps.executeBatch(); *Ud=x^JxO
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Ucqn3&
dVKctt'C
事务的处理 tE(_Cg
1、关闭Connection的自动提交 sgfci{~
cn.setAutoCommit(false); 9h/JW_
2、执行一系列sql语句 }|9!|Q
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ?qJt4Om
Statement sm ; LLD#)Jl{?
sm = cn.createStatement(insert into user...); 7)zF8V
sm.executeUpdate(); xN +Oca
sm.close(); 3[r9v!l
sm = cn.createStatement("insert into corp...); Ej#pM.
sm.executeUpdate(); |?\J,h
sm.close(); 'i;/?'!W6
3、提交 rUxjm\
cn.commit(); 3k_bhK zI
4、如果发生异常,那么回滚 s,|"s|P
cn.rollback();