VO(value object) 值對象
通常用于業務層之間的數據傳遞,和PO一樣也是僅僅包含數據而已。但應是抽象出的業務對象,可以和表對應,也可以不,這根據業務的需要.個人覺得同DTO(數據傳輸對象),在web上傳遞。
對于數據庫而言,每一個VO對象可以表示出一張表中的一行記錄,此類的名稱要與表的名稱一致。
BO(business object) 業務對象
從業務模型的角度看,見UML元件領域模型中的領域對象。封裝業務邏輯的java對象,通過調用DAO方法,結合PO,VO進行業務操作。
PO(persistant object) 持久對象
在o/r映射的時候出現的概念,如果沒有o/r映射,沒有這個概念存在了。通常對應數據模型(數據庫),本身還有部分業務邏輯的處理。可以看成是與數據庫中的表相映射的java對象。最簡單的PO就是對應數據庫中某個表中的一條記錄,多個記錄可以用PO的集合。PO中應該不包含任何對數據庫的操作。
DAO(data access object )數據訪問對象
此對象用于訪問數據庫。通常和PO結合使用,DAO中包含了各種數據庫的操作方法。通過它的方法,結合PO對數據庫進行相關的操作。
建議命名規則:I表名DAO,如IUserDAO
方法命名規則:更新數據庫 doXxx()
查詢數據庫 findXxx()或getXxx()
POJO(plain ordinary java object) 簡單無規則java對象。
DAO設計模式
實現類
實現DAO接口的具體方法,如實現具體CRUD操作。但沒有具體的數據庫的連接、打開、關閉,具體的操作可以放在代理(Proxy)中,因為這些操作與具體業務無關。
代理(Proxy)
實現具體的操作及數據庫的連接開關,并且實現其具體的主題類。
工廠模式(Factory)
有接口就必須有工廠類進行耦合。
注意:在Java開發web頁面中,永遠不導入java.sql包,只能導入java.util.*和vo包。
下面給出一個具體的例子的代碼(來自mldn李新華的教程):
VO:(oracle.vo)
工廠Factory類
通常用于業務層之間的數據傳遞,和PO一樣也是僅僅包含數據而已。但應是抽象出的業務對象,可以和表對應,也可以不,這根據業務的需要.個人覺得同DTO(數據傳輸對象),在web上傳遞。
對于數據庫而言,每一個VO對象可以表示出一張表中的一行記錄,此類的名稱要與表的名稱一致。
BO(business object) 業務對象
從業務模型的角度看,見UML元件領域模型中的領域對象。封裝業務邏輯的java對象,通過調用DAO方法,結合PO,VO進行業務操作。
PO(persistant object) 持久對象
在o/r映射的時候出現的概念,如果沒有o/r映射,沒有這個概念存在了。通常對應數據模型(數據庫),本身還有部分業務邏輯的處理。可以看成是與數據庫中的表相映射的java對象。最簡單的PO就是對應數據庫中某個表中的一條記錄,多個記錄可以用PO的集合。PO中應該不包含任何對數據庫的操作。
DAO(data access object )數據訪問對象
此對象用于訪問數據庫。通常和PO結合使用,DAO中包含了各種數據庫的操作方法。通過它的方法,結合PO對數據庫進行相關的操作。
建議命名規則:I表名DAO,如IUserDAO
方法命名規則:更新數據庫 doXxx()
查詢數據庫 findXxx()或getXxx()
POJO(plain ordinary java object) 簡單無規則java對象。
DAO設計模式

實現DAO接口的具體方法,如實現具體CRUD操作。但沒有具體的數據庫的連接、打開、關閉,具體的操作可以放在代理(Proxy)中,因為這些操作與具體業務無關。
代理(Proxy)
實現具體的操作及數據庫的連接開關,并且實現其具體的主題類。
工廠模式(Factory)
有接口就必須有工廠類進行耦合。
注意:在Java開發web頁面中,永遠不導入java.sql包,只能導入java.util.*和vo包。
下面給出一個具體的例子的代碼(來自mldn李新華的教程):
VO:(oracle.vo)
1
package org.lxh.oracle.vo;
2
3
import java.util.Date;
4
5
public class Emp {
6
private int empno ;
7
private String ename ;
8
private String job ;
9
private Date hiredate ;
10
private float sal ;
11
private float comm ;
12
private String photo ;
13
public float getComm() {
14
return comm;
15
}
16
public void setComm(float comm) {
17
this.comm = comm;
18
}
19
public int getEmpno() {
20
return empno;
21
}
22
public void setEmpno(int empno) {
23
this.empno = empno;
24
}
25
public Date getHiredate() {
26
return hiredate;
27
}
28
public void setHiredate(Date hiredate) {
29
this.hiredate = hiredate;
30
}
31
public String getJob() {
32
return job;
33
}
34
public void setJob(String job) {
35
this.job = job;
36
}
37
public String getPhoto() {
38
return photo;
39
}
40
public void setPhoto(String photo) {
41
this.photo = photo;
42
}
43
public float getSal() {
44
return sal;
45
}
46
public void setSal(float sal) {
47
this.sal = sal;
48
}
49
public String getEname() {
50
return ename;
51
}
52
public void setEname(String ename) {
53
this.ename = ename;
54
}
55
}
DB的連接及開關
2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

1
package org.lxh.oracle.dbc;
2
3
import java.sql.* ;
4
public class DataBaseConnection{
5
public static final String DBDRIVER =
6
7
"oracle.jdbc.driver.OracleDriver" ;
8
public static final String DBURL =
9
10
"jdbc:oracle:thin:@localhost:1521:MLDN" ;
11
public static final String DBUSER =
12
13
"scott" ;
14
public static final String DBPASS =
15
16
"tiger" ;
17
private Connection conn = null ;
18
public DataBaseConnection(){
19
try{
20
Class.forName(DBDRIVER)
21
22
;
23
conn =
24
25
DriverManager.getConnection
26
27
(DBURL,DBUSER,DBPASS) ;
28
}catch(Exception e){
29
e.printStackTrace() ;
30
}
31
}
32
public Connection getConnection(){
33
return this.conn ;
34
}
35
public void close(){
36
if(this.conn!=null){
37
try{
38
39
40
this.conn.close() ;
41
}catch(Exception e){}
42
}
43
}
44
};
45
DAO類:
2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

1
package org.lxh.oracle.dao;
2
3
import java.util.List;
4
5
import org.lxh.oracle.vo.Emp;
6
7
public interface IEmpDAO {
8
public boolean doCreate(Emp emp) throws Exception;
9
10
public boolean doUpdate(Emp emp) throws Exception;
11
12
public boolean doDelete(int empno) throws Exception;
13
14
public Emp findById(int empno) throws Exception;
15
16
public List findAll(int currentPage,int lineSize,String keyWord) throws Exception ;
17
18
public int getAllCount(String keyWord) throws Exception ;
19
}
Implements實現類
2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

1
package org.lxh.oracle.dao.impl;
2
3
import java.sql.Connection;
4
import java.sql.PreparedStatement;
5
import java.sql.ResultSet;
6
import java.util.ArrayList;
7
import java.util.List;
8
9
import org.lxh.oracle.dao.IEmpDAO;
10
import org.lxh.oracle.vo.Emp;
11
12
public class IEmpDAOImpl implements IEmpDAO {
13
private Connection conn = null; // 如果要想完成數據庫操作則肯定需要數據庫連接對象
14
public IEmpDAOImpl(Connection conn){
15
this.conn = conn ; // 由外部實例化時傳遞連接
16
}
17
public boolean doCreate(Emp emp) throws Exception {
18
boolean flag = false;
19
PreparedStatement pstmt = null;
20
String sql = "INSERT INTO emp(empno,ename,job,hiredate,sal,comm,photo) VALUES (?,?,?,?,?,?,?)";
21
try {
22
pstmt = this.conn.prepareStatement(sql);
23
pstmt.setInt(1, emp.getEmpno());
24
pstmt.setString(2, emp.getEname());
25
pstmt.setString(3, emp.getJob());
26
pstmt.setDate(4, new java.sql.Date(emp.getHiredate().getTime()));
27
pstmt.setFloat(5, emp.getSal());
28
pstmt.setFloat(6, emp.getComm());
29
pstmt.setString(7, emp.getPhoto());
30
int count = pstmt.executeUpdate(); // 執行更新,返回更新的記錄數
31
if (count > 0) {
32
flag = true;
33
}
34
} catch (Exception e) {
35
throw e;
36
} finally {
37
try {
38
pstmt.close();
39
} catch (Exception e) {
40
}
41
}
42
return flag;
43
}
44
45
public boolean doDelete(int empno) throws Exception {
46
boolean flag = false;
47
PreparedStatement pstmt = null;
48
String sql = "DELETE FROM emp WHERE empno=?";
49
try {
50
pstmt = this.conn.prepareStatement(sql);
51
pstmt.setInt(1, empno);
52
int count = pstmt.executeUpdate(); // 執行更新,返回更新的記錄數
53
if (count > 0) {
54
flag = true;
55
}
56
} catch (Exception e) {
57
throw e;
58
} finally {
59
try {
60
pstmt.close();
61
} catch (Exception e) {
62
}
63
}
64
return flag;
65
}
66
67
public boolean doUpdate(Emp emp) throws Exception {
68
boolean flag = false;
69
PreparedStatement pstmt = null;
70
String sql = "UPDATE emp SET ename=?,job=?,hiredate=?,sal=?,comm=?,photo=? WHERE empno=?";
71
try {
72
pstmt = this.conn.prepareStatement(sql);
73
pstmt.setString(1, emp.getEname());
74
pstmt.setString(2, emp.getJob());
75
pstmt.setDate(3, new java.sql.Date(emp.getHiredate().getTime()));
76
pstmt.setFloat(4, emp.getSal());
77
pstmt.setFloat(5, emp.getComm());
78
pstmt.setString(6, emp.getPhoto());
79
pstmt.setInt(7, emp.getEmpno());
80
int count = pstmt.executeUpdate(); // 執行更新,返回更新的記錄數
81
if (count > 0) {
82
flag = true;
83
}
84
} catch (Exception e) {
85
throw e;
86
} finally {
87
try {
88
pstmt.close();
89
} catch (Exception e) {
90
}
91
}
92
return flag;
93
}
94
95
public List findAll(int currentPage, int lineSize, String keyWord)
96
throws Exception {
97
List allEmp = new ArrayList();
98
PreparedStatement pstmt = null;
99
String sql = "SELECT temp.* FROM "
100
+ "(SELECT empno,ename,job,hiredate,sal,comm,photo,ROWNUM rn "
101
+ " FROM emp "
102
+ " WHERE (empno LIKE upper(?) OR ename LIKE upper(?) OR job LIKE upper(?) "
103
+ "OR to_char(hiredate,'yyyy') LIKE upper(?) OR to_char(hiredate,'mm') LIKE upper(?)"
104
+ " OR to_char(hiredate,'dd') LIKE upper(?) OR sal LIKE upper(?) OR comm LIKE upper(?)) "
105
+ " AND ROWNUM<=" + (currentPage * lineSize)
106
+ ") temp WHERE temp.rn>" + (currentPage - 1) * lineSize;
107
try {
108
pstmt = this.conn.prepareStatement(sql);
109
pstmt.setString(1, "%" + keyWord + "%");
110
pstmt.setString(2, "%" + keyWord + "%");
111
pstmt.setString(3, "%" + keyWord + "%");
112
pstmt.setString(4, "%" + keyWord + "%");
113
pstmt.setString(5, "%" + keyWord + "%");
114
pstmt.setString(6, "%" + keyWord + "%");
115
pstmt.setString(7, "%" + keyWord + "%");
116
pstmt.setString(8, "%" + keyWord + "%");
117
ResultSet rs = pstmt.executeQuery();
118
Emp emp = null;
119
while (rs.next()) {
120
emp = new Emp();
121
emp.setEmpno(rs.getInt(1));
122
emp.setEname(rs.getString(2));
123
emp.setJob(rs.getString(3));
124
emp.setHiredate(rs.getDate(4));
125
emp.setSal(rs.getFloat(5));
126
emp.setComm(rs.getFloat(6));
127
emp.setPhoto(rs.getString(7));
128
allEmp.add(emp);
129
}
130
rs.close();
131
} catch (Exception e) {
132
throw e;
133
} finally {
134
try {
135
pstmt.close();
136
} catch (Exception e) {
137
}
138
}
139
return allEmp;
140
}
141
142
public Emp findById(int empno) throws Exception {
143
Emp emp = null;
144
PreparedStatement pstmt = null;
145
String sql = "SELECT empno,ename,job,hiredate,sal,comm,photo FROM emp WHERE empno=?";
146
try {
147
pstmt = this.conn.prepareStatement(sql);
148
pstmt.setInt(1, empno);
149
ResultSet rs = pstmt.executeQuery();
150
if (rs.next()) { // 表示已經查找到了
151
emp = new Emp();
152
emp.setEmpno(rs.getInt(1));
153
emp.setEname(rs.getString(2));
154
emp.setJob(rs.getString(3));
155
emp.setHiredate(rs.getDate(4));
156
emp.setSal(rs.getFloat(5));
157
emp.setComm(rs.getFloat(6));
158
emp.setPhoto(rs.getString(7));
159
}
160
rs.close();
161
} catch (Exception e) {
162
throw e;
163
} finally {
164
try {
165
pstmt.close();
166
} catch (Exception e) {
167
}
168
}
169
return emp;
170
}
171
172
public int getAllCount(String keyWord) throws Exception {
173
int count = 0;
174
PreparedStatement pstmt = null;
175
String sql = "SELECT COUNT(empno) FROM emp "
176
+ " WHERE empno LIKE upper(?) OR ename LIKE upper(?) OR job LIKE upper(?) "
177
+ " OR to_char(hiredate,'yyyy') LIKE upper(?) OR to_char(hiredate,'mm') LIKE upper(?) "
178
+ " OR to_char(hiredate,'dd') LIKE upper(?) OR sal LIKE upper(?) OR comm LIKE upper(?)";
179
try {
180
pstmt = this.conn.prepareStatement(sql);
181
pstmt.setString(1,"%"+keyWord+"%") ;
182
pstmt.setString(2,"%"+keyWord+"%") ;
183
pstmt.setString(3,"%"+keyWord+"%") ;
184
pstmt.setString(4,"%"+keyWord+"%") ;
185
pstmt.setString(5,"%"+keyWord+"%") ;
186
pstmt.setString(6,"%"+keyWord+"%") ;
187
pstmt.setString(7,"%"+keyWord+"%") ;
188
pstmt.setString(8,"%"+keyWord+"%") ;
189
ResultSet rs = pstmt.executeQuery();
190
if (rs.next()) { // 表示已經查找到了
191
count = rs.getInt(1) ;
192
}
193
rs.close();
194
} catch (Exception e) {
195
throw e;
196
} finally {
197
try {
198
pstmt.close();
199
} catch (Exception e) {
200
}
201
}
202
return count;
203
}
204
205
}
206
Proxy類
2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

1
package org.lxh.oracle.dao.proxy;
2
3
import java.util.List;
4
5
import org.lxh.oracle.dao.IEmpDAO;
6
import org.lxh.oracle.dao.impl.IEmpDAOImpl;
7
import org.lxh.oracle.dbc.DataBaseConnection;
8
import org.lxh.oracle.vo.Emp;
9
10
public class IEmpDAOProxy implements IEmpDAO {
11
private DataBaseConnection dbc = null ;
12
private IEmpDAO dao = null ;
13
private int count = 0 ;
14
public IEmpDAOProxy(){
15
this.dbc = new DataBaseConnection() ; // 在代理類中完成數據庫連接對象的實例化
16
this.dao = new IEmpDAOImpl(this.dbc.getConnection()) ;
17
}
18
public boolean doCreate(Emp emp) throws Exception {
19
boolean flag = false ;
20
try{
21
if(this.dao.findById(emp.getEmpno())==null){
22
flag = this.dao.doCreate(emp) ; // 調用真實主題實現類
23
}
24
}catch(Exception e){
25
throw e ;
26
}finally{
27
this.dbc.close() ;
28
}
29
return flag;
30
}
31
32
public boolean doDelete(int empno) throws Exception {
33
boolean flag = false ;
34
try{
35
flag = this.dao.doDelete(empno) ; // 調用真實主題實現類
36
}catch(Exception e){
37
throw e ;
38
}finally{
39
this.dbc.close() ;
40
}
41
return flag;
42
}
43
44
public boolean doUpdate(Emp emp) throws Exception {
45
boolean flag = false ;
46
try{
47
flag = this.dao.doUpdate(emp) ; // 調用真實主題實現類
48
}catch(Exception e){
49
throw e ;
50
}finally{
51
this.dbc.close() ;
52
}
53
return flag;
54
}
55
56
public List findAll(int currentPage, int lineSize, String keyWord)
57
throws Exception {
58
List all = null ;
59
try{
60
all = this.dao.findAll(currentPage, lineSize, keyWord) ;
61
this.count = this.dao.getAllCount(keyWord) ; // 查全部記錄的時候把全部的記錄數也查出來
62
}catch(Exception e){
63
throw e ;
64
}finally{
65
this.dbc.close() ;
66
}
67
return all;
68
}
69
70
public Emp findById(int empno) throws Exception {
71
Emp emp = null ;
72
try{
73
emp = this.dao.findById(empno) ;
74
}catch(Exception e){
75
throw e ;
76
}finally{
77
this.dbc.close() ;
78
}
79
return emp;
80
}
81
82
public int getAllCount(String keyWord) throws Exception {
83
return this.count;
84
}
85
86
}
87

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

工廠Factory類
1
package org.lxh.oracle.dao.factory;
2
3
import org.lxh.oracle.dao.IEmpDAO;
4
import org.lxh.oracle.dao.proxy.IEmpDAOProxy;
5
6
public class DAOFactory {
7
public static IEmpDAO getIEmpDAOInstance(){
8
return new IEmpDAOProxy() ;
9
}
10
}

2

3

4

5

6

7

8

9

10
