java 数据库基本操作
5_+pgJL
1、java数据库操作基本流程 G0lg5iA<fC
2、几个常用的重要技巧: Zq"
可滚动、更新的记录集 &Vy.)0
批量更新 ~F.kgX
事务处理 DR(/|?k+
Oq[YbQ'GE
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 giHWC%/
1、取得数据库连接 `6\u!#
1)用DriverManager取数据库连接 `&jG8lHa
例子 U.pGp]\Q)G
String className,url,uid,pwd; V|vXxWm/
className = "oracle.jdbc.driver.OracleDriver"; 'j$n;3
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; sEHA?UP$<F
uid = "system"; X!|K 4Z!k
pwd = "manager"; b#W(&b^q
Class.forName(className);
x0||'0I0
Connection cn = DriverManager.getConnection(url,uid,pwd); -J;;6aA
2)用jndi(java的命名和目录服务)方式 /wPW2<|"X.
例子 .OZ\s%h;
String jndi = "jdbc/db"; TlCGP)VSj
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Y(;u)uN_
DataSource ds = (DataSource) ctx.lookup(jndi); ^ pNA_s!S
Connection cn = ds.getConnection(); Ov@vNj&
多用于jsp中 j_0xE;g"]
2、执行sql语句 M&}_3
1)用Statement来执行sql语句 6 2LLfD
String sql; UgTgva>?
Statement sm = cn.createStatement(); 9dwLkr
sm.executeQuery(sql); // 执行数据查询语句(select) .s%dP.P:i1
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); [e7nW9\l
2)用PreparedStatement来执行sql语句 8<=]4- X@
String sql; IqCh4y3
sql = "insert into user (id,name) values (?,?)"; ]2rCn};
PreparedStatement ps = cn.prepareStatement(sql); $ qTv2)W1{
ps.setInt(1,xxx); ,*Z/3at}5M
ps.setString(2,xxx); d Z}|G-:
... 4l@aga
ResultSet rs = ps.executeQuery(); // 查询 JOo+RA5d
int c = ps.executeUpdate(); // 更新 OU[ FiW-E
|&_(I
3、处理执行结果 FyqsFTh_
查询语句,返回记录集ResultSet P-\65]`C
更新语句,返回数字,表示该更新影响的记录数 d0 mfqP=
ResultSet的方法 IweNe`Z
1、next(),将游标往后移动一行,如果成功返回true;否则返回false vu~7Z;y(<j
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Ao, <G.>R
'DD~xCXE
4、释放连接 eQJyO9$G
cn.close(); 3/Dis)
v8
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection F- {hXM
N=j$~,yG
可滚动、更新的记录集
o('6,D
1、创建可滚动、更新的Statement H`nd |
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); *})Np0k
该Statement取得的ResultSet就是可滚动的 >"[Nmx0;w
2、创建PreparedStatement时指定参数 dZ x
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ->'xjD
ResultSet.absolute(9000); '[p0+5*x
批量更新 \t]_UNGyW
1、Statement x$) E^|A+
Statement sm = cn.createStatement(); +&[X7r<
sm.addBatch(sql1); bO+e?&vQ%
sm.addBatch(sql2); LY2QKjgP
... W?gelu]
sm.executeBatch() lz4M)pL^
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 #ds@!u+&
2、PreparedStatement <
49\B
PreparedStatement ps = cn.preparedStatement(sql); M%2w[<-8c
{ co*XW
ps.setXXX(1,xxx); j/uzsu+
... }1|FES
ps.addBatch(); W#foVAi .
} q>m[vvt"
ps.executeBatch(); x{3q'2
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 A5~OHmeK
nTHCb>,vM
事务的处理 LZ8xh
1、关闭Connection的自动提交 YJ>P+e\o9
cn.setAutoCommit(false); yJ?=HH?
2、执行一系列sql语句 "\qm +g
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ^TT_BAI
Statement sm ; >g,i"Kg
sm = cn.createStatement(insert into user...); s lYC\"$
sm.executeUpdate(); $$eBr8
sm.close(); Wql,*|
sm = cn.createStatement("insert into corp...); IJBIO>Z/
sm.executeUpdate(); kyL]4:@W`
sm.close(); O+=C8
3、提交 pDt45
cn.commit(); g:?p/L
4、如果发生异常,那么回滚 _+d*ljP)l3
cn.rollback();