java 数据库基本操作 nc3usq
1、java数据库操作基本流程 _9yW; i-
2、几个常用的重要技巧: xc}kDpF=g
可滚动、更新的记录集 >N~orSw%
批量更新 .WLwAL
事务处理 u-M Td
} `Cc-X7
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 }Qa
1、取得数据库连接 H1c>3c
1)用DriverManager取数据库连接 KwNOB _
例子 0SR[)ma
String className,url,uid,pwd; s2`} ~
className = "oracle.jdbc.driver.OracleDriver"; oT0:Ny
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; "m>BE
uid = "system"; {8 #
pwd = "manager"; |G)P
I`BH
Class.forName(className); _MWW
Connection cn = DriverManager.getConnection(url,uid,pwd); 7jw5'`;)"
2)用jndi(java的命名和目录服务)方式 !i_~<6Wa7
例子 {b|V;/
String jndi = "jdbc/db"; l?A~^4(5a/
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); []doLt;J
DataSource ds = (DataSource) ctx.lookup(jndi); `-MCI)Fq_R
Connection cn = ds.getConnection(); &o]fBdn
多用于jsp中 cJ\1ndBH
2、执行sql语句 ,zEPdhTX
1)用Statement来执行sql语句 T_[5 ZYy
String sql; [Lcy &+
Statement sm = cn.createStatement(); JmC2buO
sm.executeQuery(sql); // 执行数据查询语句(select) dDA,Ps
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ]?T,J+S
2)用PreparedStatement来执行sql语句 YpgO]\/w
String sql; fI,2l
sql = "insert into user (id,name) values (?,?)"; tn;Uaw
PreparedStatement ps = cn.prepareStatement(sql); 8=)9ZjfD
ps.setInt(1,xxx); +~EnrrT+W
ps.setString(2,xxx); ;6$W-W _
... Bk]
`n'W
ResultSet rs = ps.executeQuery(); // 查询 ^HU>fkSk
int c = ps.executeUpdate(); // 更新 u"Mf xW`
#y'p4Xf
3、处理执行结果 W=y9mW|p/
查询语句,返回记录集ResultSet Y() ZM
更新语句,返回数字,表示该更新影响的记录数 MoXai0d%
ResultSet的方法 jX.'G
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Gd`s01GKQ
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 +TAyCxfmt
]c1#_MW
4、释放连接 JQ|*XU
cn.close(); F$ckW'V
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection NtmmPJ|5
qOAP_\@T
可滚动、更新的记录集 k*OHI/uiow
1、创建可滚动、更新的Statement >`^;h]Q
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Wj8WT)cB
该Statement取得的ResultSet就是可滚动的 ^B8[B&K
2、创建PreparedStatement时指定参数 v%kl*K`*
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); }zIWagC6
ResultSet.absolute(9000); tkmzOc H
批量更新 /]?e^akA
1、Statement e~SRGyIww
Statement sm = cn.createStatement(); r)B55;*Fh
sm.addBatch(sql1); v|dt[>G
sm.addBatch(sql2); b'I@TLE')
... ^A=2#j~H\
sm.executeBatch() WD5jO9Oai
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 9rIv-&7'm
2、PreparedStatement ixL[(*V
PreparedStatement ps = cn.preparedStatement(sql); TEla?N
{ kkJ8xyO
ps.setXXX(1,xxx); PzT@q\O
... --k!KrL
ps.addBatch(); MwX8F YF
D
} 1+[,eq
ps.executeBatch(); V+zn`
\a
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Tkn8Wj
.$1S-+(kV
事务的处理 TrNh,5+b
1、关闭Connection的自动提交 a]J>2A@-I
cn.setAutoCommit(false); l
GJ N;G7
2、执行一系列sql语句 -v:3#9uX)
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ,kUg"\_k
Statement sm ; ,4k3C#!.i
sm = cn.createStatement(insert into user...); @vL0gzE?nB
sm.executeUpdate(); |"[;0)dw^
sm.close(); s`pdy$
sm = cn.createStatement("insert into corp...); R2Lq??XA=
sm.executeUpdate(); xVrLoAw
sm.close(); ]z2x`P^oI
3、提交 F$'po#
cn.commit(); KO/#t~
4、如果发生异常,那么回滚 6\Tq,I7
cn.rollback();