开发者学堂课程【DAO 开发实战业务分析:业务层设计与开发(业务层标准实现类)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/399/detail/5167
业务层设计与开发(业务层标准实现类)
内容介绍:
一、主要操作
二、具体操作
三、修改操作
四、总结
一、主要操作
本着业务层的主要操作有两个:
分别是控制数据库的打开和关闭,可以通过 DatabaseConnection 完成的以及控制数据层的调用,需要通过 Factory 工厂类取得 IMemeberDAO 接口对象,同时还需要传递 Connection。说明在整个业务层之中不管数据层的操作是否有问题,最终都一定要进行数据库的关闭处理。
IMemberService 的子类为 IMemberServiceImpl 子类,这个子类要求保存在cn.mldn.oracle.service.impl 子包之中。
然后跟上 service ,写出 impl 位,找到 MemberServiceImpl,实现IMemberService 的操作接口,
可以得到程序如下:
1
package
cn
.
mldn.oracle.service.impl;
2
3
*import
java
.
util
.list;
9
10
p
ublic class M
ember
S
ervice
I
mpl
implements
I
M
ember
S
ervice
{
11
1
2
@Override
13
public
boolean
add(
Member vo) throws Exception {
14 // TODO Auto-
generated
method
stub
15
return
false;
16
}
17
1
8
@Override
19
public
boolean
add(
Member vo) throws Exception {
20 // TODO Auto-
generated
method
stub
21
return
false;
22
}
而一旦取得11行这个位的对象,意味着要开始操作数据库,所以代码写为private
Database
C
onnection
dbc
=
new
Database
C
onnection
() ;
。因为程序的设计问题,一旦要取得本位十位化的项,就一定意味着要有数据库的连接对象。
数据层需要一个明确的 Connection 参数传递,导致整个设计的过程之中都需要考虑 Connection 问题,但后面改进后就不用再进行整个过程的考虑问题即为程序的设计问题。
不管中间经过了多少个操作,都会有异常出现,然后将异常向出抛,最后都要执行close()操作。即程序如下:
public
boolean
add(
Member vo) throws Exception {
try {
}
catch(Exception
e)
{
throw
e
;
} finally {
this.
dbc.close();
}
return
false;
}
所以所有的操作代码加总,无论进行怎样的变化,此结构是不能够被改变的,数据库最后一定要进行关闭处理。
二、具体操作
(1)add 操作
举例如下:
public
boolean
add(
Member vo) throws Exception {
try
{
// 1
、取得I
M
emeber
DAO
接口对象
IM
ember
DAO
dao
= DAOF
actory
.
get
I
nstance(Member
DAOI
mpl
.
class,
this
.
dbc.getConnection())
if(dao.find
B
y
I
d(vo.
getMid())== null){
/
/ 2
、判断当前的id是否存在
此处程序说明要根据 id 查找,但是没有查找到数据,用户则不存在,如果不存在,则再判断,
程序如下:
if(dao.find
B
y
I
d(vo.
getMid())== null){
/
/ 2
、判断当前的id是否存在
if(dao. dao.find
ByPhone
(vo.
getPhone())
=
=null){ // 3
、电话不存在
if(vo.
getAge() < 0){
如果小于等于0,则表示没有设置电话,即为:
if(vo.
getAge() <= 0){ //
没有设置电话/年龄或者设置错误
vo.
setAge(-1);
/
/
使用-
1
作为一个标志结果
}
如果以上都没问题,则
return
dao
.doCreate(vo) ; //
4、进行数据库保存
以上可看出一个业务层要牵涉多个数据层调用。
(2)edit 操作
举例如下:
public
boolean edit
(
Member vo) throws Exception {
try
{
// 1
、取得I
M
emeber
DAO
接口对象
IM
ember
DAO
dao
= DAOF
actory
.
get
I
nstance(Member
DAOI
mpl
.
class,
this
.dbc.getConnection())
/
/ 2
、要根据电话来查找数据是否存在,但需要考虑到判断的用户不能是自己
M
ember
temp
=
dao.
findByPhone(phone) ;
然后再找到
M
ember
temp
=
dao.
findByPhone(
vo.get
Phon
()
) ;
完成后要进行判断
if(temp
==
null)
{
return
dao.
doUpdate(vo) ;
}
else { //
不等于空,表示现在电话存在
if(vo
.getMid().equals(temp.getMid())){ //
自己的电话
return
dao.doUpdate(vo
)
;
}
}
三、修改操作
(1)remove 修改
举例如下:
public
boolean
remove
(
S
et<
String> ids) throws Exception {
try
{
if (ids == null || ids.size() == 0) {
return false ;
}
return DAOF
actory
.
get
I
nstance(Member
DAOI
mpl
.
class,
this
.
dbc.getConnection())
.doRemoveBatch(ids) ;
(2)get修改
举例如下:
public
M
ember
get
(
S
tring
id
) throws Exception {
try
{
return
DAOF
actory
.
get
I
nstance(Member
DAOI
mpl
.
class,
this
.
dbc.getConnection())
.
findB
yId(id
)
;
(3)list 修改
举例如下:
public L
ist<
M
ember
>
list()
throws Exception {
try
{
return
DAOF
actory
.
get
I
nstance(Member
DAOI
mpl
.
class,
this
.
dbc.getConnection())
.find
All();
(4)Map 修改
举例如下:
public
M
ap<
S
tring,
O
bject
>
list(int
current
P
age, int
line
S
ize)
throws Exception {
try
{
M
ap<
S
tring,
O
bject
>
map
=
new
H
ash
M
ap<
S
tring,
O
bject
>
() ;
}
catch(Exception
e)
{
throw
e
;
} finally {
this.
dbc.close();
}
return
map
;
}
此处 map 无法返回。需要放到
M
ap<
S
tring,
O
bject
>
map
=
new
H
ash
M
ap<
S
tring,
O
bject
>
() ;
return
map;
才可返回。因为是在 try 中定义的 map,所以只能在 try 中进行操作。
此时注意所需要的 key,分别是all
M
ember和member
C
ount
public
M
ap<
S
tring,
O
bject
>
list(int
current
P
age, int
line
S
ize)
throws Exception {
try
{
M
ap<
S
tring,
O
bject
>
map
=
new
H
ash
M
ap<
S
tring,
O
bject
>
() ;
IM
ember
DAO
dao
= DAOF
actory
.
get
I
nstance
(Member
DAOI
mpl
.
class,
this
.
dbc.getConnection())
;
map.
put(“allMembers”, value) ;
再找到 dao,即
map.
put(“allMembers”,
dao.
f
i
ndAllSplit(currentPage, lineSize)) ;
map.
put(“memberCount”, value) ;
再找到dao,即
map.
put(“memberCount”,
dao.
getAllCount() ) ;
return map
;
同样在以下可使用,即
public
M
ap<
S
tring,
O
bject
>
list(S
tring column, String keyword,
int
current
P
age, int
line
S
ize)
throws Exception {
try
{
M
ap<
S
tring,
O
bject
>
map
=
new
H
ash
M
ap<
S
tring,
O
bject
>
() ;
IM
ember
DAO
dao
= DAOF
actory
.
get
I
nstance(Member
DAOI
mpl
.
class,
this
.
dbc.getConnection())
;
map.
put(“allMembers”,
dao.
f
i
ndAllSplit(currentPage, lineSize)) ;
map.
put(“memberCount”,
dao.
getAllCount() ) ;
return map
;
但此时要此外做一个判断,即
IM
ember
DAO
dao
= DAOF
actory
.
get
I
nstance(Member
DAOI
mpl
.
class,
this
.
dbc.getConnection())
;
if(column
==
null
|| keyWord == null || “”.equals(keyword))
map.
put(“allMembers”,
dao.
f
i
ndAllSplit(currentPage, lineSize)) ;
map.
put(“memberCount”,
dao.
getAllCount() ) ;
} else {
map.
put(“allMembers”,
dao.
f
i
ndAllSplit(column,keyword,currentPage, lineSize)) ;
map.
put(“memberCount”,
dao.
getAllCount(column,keyword) ) ;
}
return map
;
在整个业务层的实现子类里面到处充斥着打开-关闭数据库。如完成核心业务
IM
ember
DAO
dao
= DAOF
actory
.
get
I
nstance(Member
DAOI
mpl
.
class,
this
.
dbc.getConnection())
// 2、要根据电话来查找数据是否存在,但需要考虑到判断的用户不能是自己
M
ember
temp
=
dao.
findByPhone(phone) ;
然后再找到
M
ember
temp
=
dao.
findByPhone(
vo.get
Phon
()
) ;
完成后要进行判断
if(temp
==
null)
{
return
dao.
doUpdate(vo) ;
}
else { //
不等于空,表示现在电话存在
if(vo
.getMid().equals(temp.getMid())){ //
自己的电话
return
dao.doUpdate(vo
)
;
}
}
,其余都是跟业务有关的辅助操作。同时数据库也要考虑到事务问题,如删除时如果发现有一部分数据没删除并且出错,错误之前时都会默认执行,这个过程也要进行一些控制处理才合适,此时发现业务层只能说是完成了功能,但是不够完善,所以还要进行大量的修改。
四、总结
在现在整个业务层的处理中,业务层依然要通过DatabaseConnection 操作 Connection,在之后的处理过程中也要跟上 MemberDAO 接口包括什么,不关注接口子位的问题,因为子位被 DAOFactory 所隐含,所以只取得 DAO 的操作接口,而后 DAO 的操作接口与 Connection 产生关系,从而实现业务层的操作流程,以上就是业务层的操作子类。