java 数据库基本操作 ~WSC6Bh@9
1、java数据库操作基本流程 al/~
2、几个常用的重要技巧: c@`P{6
可滚动、更新的记录集 Wj&s5;2a
批量更新 &n|gPp77$
事务处理 *O~D lf
zPe .
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 >\ W" 3.
1、取得数据库连接 0dW1I|jR
1)用DriverManager取数据库连接 vq}V0-
<
例子 K4"as9oFP
String className,url,uid,pwd; 5>
UgBA
className = "oracle.jdbc.driver.OracleDriver"; E2MpMR
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; DVd/OU
uid = "system"; X9 R-GT
pwd = "manager"; ~$B,K]
Class.forName(className); Iu8=[F>
Connection cn = DriverManager.getConnection(url,uid,pwd); P\JpE
2)用jndi(java的命名和目录服务)方式 j*"s~8u4
例子 H UjmJu6f{
String jndi = "jdbc/db"; 2k_Bo~.
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); sdLFBiR
DataSource ds = (DataSource) ctx.lookup(jndi); {<@~;iq
Connection cn = ds.getConnection(); 2r,fF<WQ
多用于jsp中 15COwc*k
2、执行sql语句 ?4_;9MkN
1)用Statement来执行sql语句 ;
OsN^
String sql; Hi Yx(hY
Statement sm = cn.createStatement(); %}/)_RzQ
sm.executeQuery(sql); // 执行数据查询语句(select) n2E2V<#
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); hf[K\aAk
2)用PreparedStatement来执行sql语句 S`::f(e
String sql; KGIz)/eSg
sql = "insert into user (id,name) values (?,?)"; (\j<`"n
PreparedStatement ps = cn.prepareStatement(sql); $aG'.0HW
ps.setInt(1,xxx); ]#nAld1cmy
ps.setString(2,xxx); IX}l)t[:(
... 39"'Fz?1
ResultSet rs = ps.executeQuery(); // 查询 -?uwlpm#
int c = ps.executeUpdate(); // 更新 0*q:p`OLw*
IH5thL@D
3、处理执行结果 B?jF1F!9
查询语句,返回记录集ResultSet `f s[C
更新语句,返回数字,表示该更新影响的记录数 k(MQ:9'|
ResultSet的方法 &>-Cz%IV
1、next(),将游标往后移动一行,如果成功返回true;否则返回false q~qig,$Y
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 &IcDUr]L
-Je+7#P1
4、释放连接 =c|Bu^(Ctw
cn.close(); =xgW$c/yB
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection {PU[MHZF
]n{2cPx5d
可滚动、更新的记录集 xsfq[}eH<
1、创建可滚动、更新的Statement wdg[pt
/>
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 1||e!W
该Statement取得的ResultSet就是可滚动的 ;RU)Q)a)
2、创建PreparedStatement时指定参数 _Qv4;a
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); <,m}TTq
ResultSet.absolute(9000); Ac|`5'/Tx
批量更新 |A2.W8`o
1、Statement vjHbg#0 %
Statement sm = cn.createStatement(); _7Z$"
sm.addBatch(sql1); t[<=QK
sm.addBatch(sql2); L8V'mUyD
... CTwP{[%Pk
sm.executeBatch() KT3[{lr
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 j1BYSfX'
2、PreparedStatement ?}W:DGudZ
PreparedStatement ps = cn.preparedStatement(sql); eA!aUu
{ w:qwU\U>x
ps.setXXX(1,xxx); .N%$I6w
... Z8m/8M
ps.addBatch(); m+o>`1>a
} U9JqZ!
ps.executeBatch(); m_pK'jc
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 @FQ@*XD
&?~> I[^~
事务的处理 -/h$Yb
1、关闭Connection的自动提交 , 7}Ri
cn.setAutoCommit(false); ]|-y[iu
2、执行一系列sql语句 @gZ%>qe
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close a(m#GES
Statement sm ; j#-74{Y$
J
sm = cn.createStatement(insert into user...); 7|{QAv
sm.executeUpdate(); }\1V;T
sm.close(); 1r;Q5[@
sm = cn.createStatement("insert into corp...); 46mu,v
sm.executeUpdate(); Fr3Q"(
sm.close(); qWWy}5SOm
3、提交 #oHHKl=M
cn.commit(); UOa{J|k>h
4、如果发生异常,那么回滚 Q} /
:
cn.rollback();