java 数据库基本操作 w5mSoKb
1、java数据库操作基本流程 BEii:05
2、几个常用的重要技巧: $p.0[A(N
可滚动、更新的记录集 S&~;l/
批量更新 @|9V]bk
事务处理 7XiR)jYo*
m# I
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 G88g@Exk
1、取得数据库连接 -}Gk@=$G
1)用DriverManager取数据库连接 YGkk"gFIA
例子 ~)!vhdBe
String className,url,uid,pwd; [1.>9ngj
className = "oracle.jdbc.driver.OracleDriver"; IaRq6=[
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 50`<[w<J
q
uid = "system"; FdmoR;
pwd = "manager"; )>WSuf
j
Class.forName(className); K$~Ja
Connection cn = DriverManager.getConnection(url,uid,pwd); \@*D;-b
2)用jndi(java的命名和目录服务)方式 fngk<$lvg
例子 YXTd^M~@D
String jndi = "jdbc/db"; [f-<M@id/
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); > ^d+;~Q;
DataSource ds = (DataSource) ctx.lookup(jndi); fvw&y+|y!
Connection cn = ds.getConnection(); c +]5[6
多用于jsp中 +q)B4A'J!
2、执行sql语句 EP]O J$6I
1)用Statement来执行sql语句 l1}HJmom
String sql; o%?~9rf]]
Statement sm = cn.createStatement(); O`='8'6zW\
sm.executeQuery(sql); // 执行数据查询语句(select)
c|~f[
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 8Sg:HU\
2)用PreparedStatement来执行sql语句 WJw
%[_W
String sql; *Duxabo?
sql = "insert into user (id,name) values (?,?)"; \ dZD2e4
PreparedStatement ps = cn.prepareStatement(sql); )R"deb=s
ps.setInt(1,xxx); "z ;ky8
ps.setString(2,xxx); "?Xb$V7
... yI}_
U
ResultSet rs = ps.executeQuery(); // 查询 Dq~D4|
int c = ps.executeUpdate(); // 更新 !\N|$-M
mX
QVL.P\
3、处理执行结果 iC Z1ARi
查询语句,返回记录集ResultSet W8s/"
更新语句,返回数字,表示该更新影响的记录数 OwG:+T_
ResultSet的方法 (Qz|
N
1、next(),将游标往后移动一行,如果成功返回true;否则返回false %z AN@
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 .5?Md
>tVD[wVF0
4、释放连接 "(SZ;y
cn.close(); |>AHc_:$$
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection jRo4+8
xouy|Nn'
可滚动、更新的记录集 <LOas$
1、创建可滚动、更新的Statement 9/R<,
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); }TAHVcX*p
该Statement取得的ResultSet就是可滚动的 naWW i]9
2、创建PreparedStatement时指定参数 zrCQEQq
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); gAViwy9{
ResultSet.absolute(9000); zu|=1C#5h
批量更新 /,#&Htk
1、Statement :TN^}RML
Statement sm = cn.createStatement(); p+d?k"WN?
sm.addBatch(sql1); ;l2pdP4jf
sm.addBatch(sql2); pbb6?R,
... F5;x>;r
sm.executeBatch() <ooRpn
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 *[[TDduh&
2、PreparedStatement <)$b=z
PreparedStatement ps = cn.preparedStatement(sql); 7"Iagrgw
{ U4$CkTe2Y
ps.setXXX(1,xxx); t(?tPt4zp
... 9<S};I;
ps.addBatch(); :p,DAt}
} Zp*0%x!e
ps.executeBatch(); K=X13As_
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 NKS-G2Y<P
^J$?[@qD
事务的处理 q<*UeyE
S
1、关闭Connection的自动提交 \hT=U*dMR
cn.setAutoCommit(false); aw8q}:
2、执行一系列sql语句 ]
cY
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close $+.!(Js"K
Statement sm ; 4w-P%-4
sm = cn.createStatement(insert into user...); 9Wi+7_)
sm.executeUpdate(); jFMf=u&U
sm.close(); a)GT\1q
sm = cn.createStatement("insert into corp...); .~Z@y#
sm.executeUpdate(); M]$_>&"
sm.close(); `jyBF
3、提交 pJ 7="n
cn.commit(); >rb8A6
4、如果发生异常,那么回滚 2pQdDbm
cn.rollback();