java 数据库基本操作 lyZof_/*
1、java数据库操作基本流程 7z=Ss'O]
2、几个常用的重要技巧: WLNkO^zb
可滚动、更新的记录集 fUb5KCZ
批量更新 SNff
事务处理 Y!o@"Ct
o LX6w
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ` M4;aN
1、取得数据库连接 MH"c=mL:
1)用DriverManager取数据库连接 ClVMZ
例子 43:~kCF[s
String className,url,uid,pwd; Aid{PGDk
className = "oracle.jdbc.driver.OracleDriver"; ,i*^fpF`F"
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 0,m*W?^31
uid = "system"; yQ+#Tlji
pwd = "manager"; 5qG7LO.
Class.forName(className); zK:/
1
Connection cn = DriverManager.getConnection(url,uid,pwd);
|ki#MtCp
2)用jndi(java的命名和目录服务)方式 ;=)CjC8)
例子 xvp{F9~qT
String jndi = "jdbc/db"; # JuO
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); )KBv[|
DataSource ds = (DataSource) ctx.lookup(jndi); FNmIXpAn*@
Connection cn = ds.getConnection(); <`|}bt
多用于jsp中 K~,,xsy,G&
2、执行sql语句 ZQl[h7c/N
1)用Statement来执行sql语句 a%(1#2^`q!
String sql; W
.Hv2r3
Statement sm = cn.createStatement(); l*'jqR')h^
sm.executeQuery(sql); // 执行数据查询语句(select) `?=AgGg
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); MQ\:/]a
2)用PreparedStatement来执行sql语句 2E2J=Do
String sql; "!Mu5Ga
sql = "insert into user (id,name) values (?,?)"; uaJ5'*
PreparedStatement ps = cn.prepareStatement(sql); A7|"0*62
ps.setInt(1,xxx); #wM0p:<
ps.setString(2,xxx); .D4D!!
... $!obpZ~ }
ResultSet rs = ps.executeQuery(); // 查询 ^5,ASU
int c = ps.executeUpdate(); // 更新 -+Q,xxu
'`[nt25N
3、处理执行结果 Fl*@@jQ8cV
查询语句,返回记录集ResultSet !k<+-Lf:2
更新语句,返回数字,表示该更新影响的记录数 mL6/NSSz
ResultSet的方法 &.(ZO]
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 7Zu!s]t
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 e>z7?"N
\3)%p('
4、释放连接 ,~G _3Oz
cn.close(); CF42KNq
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection YLobBtXc9
ItOVx!"@9
可滚动、更新的记录集 5QSd$J
1、创建可滚动、更新的Statement 7BI0g@$Nn]
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); R>gj"nB
该Statement取得的ResultSet就是可滚动的 y-sQ"HPN
2、创建PreparedStatement时指定参数 M9f*7{c
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); u%}vTCg*p
ResultSet.absolute(9000); }E/L:
批量更新 sUbZVPDr
1、Statement },i?3dSvl
Statement sm = cn.createStatement(); te:"1:e
sm.addBatch(sql1); ;xth#j
sm.addBatch(sql2); 5YC(gv3/
... _|tg#i|Om
sm.executeBatch() '{:(4>&
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ZibHT:n
2、PreparedStatement f4g(hjETbu
PreparedStatement ps = cn.preparedStatement(sql); &LL81u6=S
{ +p<Y)Z(>6
ps.setXXX(1,xxx);
uft~+w
P
... Xd|5{
ps.addBatch(); @KS:d\l}U
} ;WGY)=-gv
ps.executeBatch(); jsez$m%vs
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 l0Pg`wH,
/
m?Z!
事务的处理 a~XNRAh
1、关闭Connection的自动提交 :K8T\
cn.setAutoCommit(false); Nr(WbD[T
2、执行一系列sql语句 8sbS7*#
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close m,up37-{
Statement sm ; bJBx~
sm = cn.createStatement(insert into user...); gWWy!H
sm.executeUpdate(); &kO4^ A
sm.close(); |}mBW@ah
sm = cn.createStatement("insert into corp...); =G=.THRUk
sm.executeUpdate(); i:[B#|%
sm.close(); :'!?dszS
3、提交 cL1cBWd
cn.commit(); 7<