java 数据库基本操作 [[]NnWJ
1、java数据库操作基本流程
9C5F#(uY
2、几个常用的重要技巧: o_[I#PT
可滚动、更新的记录集 >N}+O<Fc
批量更新 /1= x8Sb
事务处理 l}#d^S/
;CV'
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 n:H
|=SF{
1、取得数据库连接 'kg~#cf/+
1)用DriverManager取数据库连接 3jto$_3'w
例子 1 7iw`@
String className,url,uid,pwd; 7~QAprwVS
className = "oracle.jdbc.driver.OracleDriver"; th0>u.hJ
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ~i>'3j0@k
uid = "system"; {`Mb ),G
pwd = "manager"; .Pux F
Class.forName(className); {~ w!
Connection cn = DriverManager.getConnection(url,uid,pwd); _LWMz=U=J/
2)用jndi(java的命名和目录服务)方式 Kf$6D 79#
例子 VwXR,(
String jndi = "jdbc/db"; \Z~
<jv
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); OXX D}-t
DataSource ds = (DataSource) ctx.lookup(jndi); N2u4MI2
Connection cn = ds.getConnection(); " ;\EU4R
多用于jsp中 *;lb<uLv
2、执行sql语句 hWX4 P
1)用Statement来执行sql语句 90wnwz
String sql; -}8r1jQH;
Statement sm = cn.createStatement(); _~*ba+{
sm.executeQuery(sql); // 执行数据查询语句(select) s(MdjWw
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close();
?9*[\m?-
2)用PreparedStatement来执行sql语句 :`4LV
String sql; }UG<_bE|
sql = "insert into user (id,name) values (?,?)"; oiz]Bd
PreparedStatement ps = cn.prepareStatement(sql); i}))6
ps.setInt(1,xxx); u (`7F(R
ps.setString(2,xxx); Q"oJhxS
... b}hQU~,E
ResultSet rs = ps.executeQuery(); // 查询 $! g~pV
int c = ps.executeUpdate(); // 更新 t
Q>/1
CY!H)6k
3、处理执行结果 Jf@Xz7{z
查询语句,返回记录集ResultSet obgO-d9l
更新语句,返回数字,表示该更新影响的记录数 P>|sCF
ResultSet的方法 7~H$p X
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ,JJ1sf2A
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 [-#q'S
>vuR:4B
4、释放连接 Q:Y`^jP
cn.close(); X(C=O?A
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection #Jfmt~ks'
}7qboUG e
可滚动、更新的记录集 rFto1m
1、创建可滚动、更新的Statement &Hl
w2^
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); .WGrzhsV
该Statement取得的ResultSet就是可滚动的 :&s8G*
2、创建PreparedStatement时指定参数 uN$ <7KB"
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); e&9v`8}
ResultSet.absolute(9000); 70nBC
批量更新 LO)QEUG
1、Statement F Zk[w>{
Statement sm = cn.createStatement(); 1(Lq9hs`
sm.addBatch(sql1); $rQi$w/
sm.addBatch(sql2);
_+&/P&
... gZ {
sm.executeBatch() biHZyUJ
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ,Aq |IH3j
2、PreparedStatement s09 &A]G
PreparedStatement ps = cn.preparedStatement(sql); Pm|S>r
{ Dwah_ p8
ps.setXXX(1,xxx); #-g2p?+i&
... *47%|bf`
ps.addBatch(); 5>h#
hcL
} <T$rvS
ps.executeBatch(); F\+!\b*lP
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Gg5>~"pb
8fQXif\z
事务的处理 ` =I@W
1、关闭Connection的自动提交 N<aMUV m
cn.setAutoCommit(false); PtOYlZTe?
2、执行一系列sql语句 F2$?[1^f
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close oD%B'{Zs4
Statement sm ; DA/\[w?J
sm = cn.createStatement(insert into user...); xGK"`\V
sm.executeUpdate(); o@r~KFIe
sm.close(); x)e(g}n
sm = cn.createStatement("insert into corp...); R|!4klb
sm.executeUpdate(); }9Awv#+
sm.close(); |`@7G`x
3、提交 ??g
=
`yH
cn.commit(); @}A3ie'w
4、如果发生异常,那么回滚 S~.%G)R
cn.rollback();