java 数据库基本操作 MV<!<Qmj
1、java数据库操作基本流程 JEsLF{
2、几个常用的重要技巧: `.>k)=F&
可滚动、更新的记录集 X7H'Uk9:
批量更新 8Z
dUPW\e
事务处理 W`N}
f]ue#O
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Eq=wdI
1、取得数据库连接 m4"N+_j
1)用DriverManager取数据库连接 Q54r?|'V
例子 \L ]
String className,url,uid,pwd; ~{4n}*
className = "oracle.jdbc.driver.OracleDriver"; i,#k}CNu
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; "!%wh6`>Md
uid = "system"; F!gNt<fZ
pwd = "manager"; j2}
Class.forName(className); R<;OEN
Connection cn = DriverManager.getConnection(url,uid,pwd); 4mN].X[,
2)用jndi(java的命名和目录服务)方式 9c6czirwR^
例子 X(k{-|9]
String jndi = "jdbc/db"; ~+N76BX
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); vZ$U^>":
DataSource ds = (DataSource) ctx.lookup(jndi); U@6jOZ
Connection cn = ds.getConnection(); g@~!kh,TH
多用于jsp中 ]*N:;J
2、执行sql语句 V@D]bV@4
1)用Statement来执行sql语句 VEj$^bpp5s
String sql; jzs.+dAg
Statement sm = cn.createStatement(); -AjH}A[!
sm.executeQuery(sql); // 执行数据查询语句(select) G'f9N^w
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ~:>AR` 9G
2)用PreparedStatement来执行sql语句 E6Q]A~
String sql; {p`mfEE(
sql = "insert into user (id,name) values (?,?)"; 1 -ZJT
PreparedStatement ps = cn.prepareStatement(sql); %K[daXw6E8
ps.setInt(1,xxx); _1^8xFe2
ps.setString(2,xxx); [o2w1R\H+x
... n/QfdAg
ResultSet rs = ps.executeQuery(); // 查询 J["H[T*
int c = ps.executeUpdate(); // 更新 nPcS3!7B#
XTJvV
3、处理执行结果 \dRzS@l
查询语句,返回记录集ResultSet bfgz1
`u
更新语句,返回数字,表示该更新影响的记录数 ]3*P:$Rq
ResultSet的方法 4%
HGMr
1、next(),将游标往后移动一行,如果成功返回true;否则返回false $<B
+K
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 <lMg\T?K
?c!:81+\
4、释放连接 B?LXI3sQZ
cn.close(); o+nG3kRD
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection dY} pN"
)^4hQ3BS
可滚动、更新的记录集 Q1Ux!$_
1、创建可滚动、更新的Statement ^[k0k(_
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ~e P
该Statement取得的ResultSet就是可滚动的 OL3UgepF
2、创建PreparedStatement时指定参数 No)
m/17y
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ncv7t|ZN
ResultSet.absolute(9000); Ia2(Km
批量更新 ) Qq'Wp3i
1、Statement rH&G<o&,
Statement sm = cn.createStatement(); <I;5wv
sm.addBatch(sql1); Sk:2+inU
sm.addBatch(sql2); wW:7y>z)
... "O*x' XhN
sm.executeBatch() 5IW8=$k~.)
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 z{:-!oF&CB
2、PreparedStatement n@!wp/J,
PreparedStatement ps = cn.preparedStatement(sql); I&Jt> O4
{ 8eluO ?p
ps.setXXX(1,xxx); igD G}q3jG
... q"akrI38
ps.addBatch(); B**Nn!}0
} nnwJYEi
ps.executeBatch(); c%z'xM
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 BOvF)4`
a+`D'?z
事务的处理 }`xdWY
1、关闭Connection的自动提交 Z) Wnow
cn.setAutoCommit(false); ~i ,"87$[
2、执行一系列sql语句 ExVDkt0
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close %@?A_jS
Statement sm ; cWMUj K/N
sm = cn.createStatement(insert into user...); y6-XHeU
sm.executeUpdate(); f'X9HU{Cz
sm.close(); /c` ^iPb
sm = cn.createStatement("insert into corp...); 5.vG^T0w
sm.executeUpdate(); 0*8TS7.3
sm.close(); !^w
E/
3、提交 xCXQ<77
cn.commit(); &<3&'*ueW
4、如果发生异常,那么回滚 PT'MNH
cn.rollback();