BaseService --- service层的抽取

本文详细介绍如何通过抽取BaseService和BaseServiceImpl来简化UserService和UserServiceImpl的代码结构,实现更清晰的分层设计,增强代码复用性和维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

service层的抽取和dao层的抽取差不多相同,主要不同点是dao实例化的问题,需要在调用时传入,并在BaseServiceImpl接收。 
详细的过程说明请参考dao层的抽取。 
dao层的抽取:http://blog.youkuaiyun.com/kyle0349/article/details/51914504

1、抽取前UserService接口

package cn.tax.nsfw.user.service;
import java.io.FileInputStream;
import java.io.Serializable;
import java.util.List;
import cn.tax.nsfw.user.entity.User;

public interface UserService {
    public void save(User user);//保存

    public void delete(User user);//删除用户

    public void update(User user);//更新用户

    public User findById(Serializable id);//根据主键查找用户

    public List<User> getAll();//查看所有

    public List<User> findLike(User user);//模糊查询

    public User findByName(String userName);//根据用户名查询 保证用户名唯一

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

2、抽取前UserServiceImpl (实现类)

package cn.tax.nsfw.user.service.impl;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.Serializable;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;

import cn.tax.nsfw.user.dao.UserDao;
import cn.tax.nsfw.user.entity.User;
import cn.tax.nsfw.user.service.UserService;

@Service("userService")
public class UserServiceImpl implements UserService {

    @Resource
    private UserDao userDao;

    public void save(User user) {
        userDao.save(user);
    }
    public void delete(User user) {
        userDao.delete(user);
    }
    public void update(User user) {
        userDao.update(user);
    }
    public User findById(Serializable id) {
        return userDao.findById(id);
    }
    public List<User> getAll() {
        return userDao.getAll();
    }
    public List<User> findLike(User user) {
        return userDao.findLike(user);
    }
    public User findByName(String userName) {
        return userDao.findByName(userName);
    }

}
  • 1
  • 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

3、创建BaseService(接口)

package cn.tax.core.service;
import java.io.Serializable;
import java.util.List;
public interface BaseService<T> {
    public void save(T entity);// 保存

    public void delete(T entity);// 删除用户

    public void update(T entity);// 更新用户

    public T findById(Serializable id);// 根据主键查找用户

    public List<T> getAll();// 查看所有

}   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

4、创建BaseServiceImpl (实现类)

  注意:
  这里我们需要用到userDao,而在这不能直接实例化userDao,
  所以需要加一个set方法,在调用service层的时候,把userDao传进来 
  用BaseDao接收userDao是没问题的。
  • 1
  • 2
  • 3
  • 4
  • 5
package cn.tax.core.service.impl;
import java.io.Serializable;
import java.util.List;
import cn.tax.core.dao.BaseDao;
import cn.tax.core.service.BaseService;
public class BaseServiceImpl<T> implements BaseService<T> {

    private BaseDao<T> baseDao;
    public void setBaseDao(BaseDao<T> baseDao) {
        this.baseDao = baseDao;
    }

    public void save(T entity) {
        baseDao.save(entity);
    }
    public void delete(T entity) {
        baseDao.delete(entity);
    }
    public void update(T entity) {
        baseDao.update(entity);
    }
    public T findById(Serializable id) {
        return baseDao.findById(id);
    }
    public List<T> getAll() {
        return baseDao.getAll();
    }

}
  • 1
  • 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

5、UserService 继承BaseService

 可以把BaseService中有的方法在UserService注释掉(删除)
  • 1
  • 2
package cn.tax.nsfw.user.service;
import java.io.FileInputStream;
import java.io.Serializable;
import java.util.List;
import cn.tax.core.service.BaseService;
import cn.tax.nsfw.user.entity.User;

public interface UserService extends BaseService<User> {

    /*public void save(User user);//保存

    public void delete(User user);//删除用户

    public void update(User user);//更新用户

    public User findById(Serializable id);//根据主键查找用户

    public List<User> getAll();//查看所有

*/
    //以下两个方法是根据业务需要新增的方法,
    //可以看到抽取完BaseService后,service层只剩下新增的业务,比较简洁
    public List<User> findLike(User user);//模糊查询

    public User findByName(String userName);//根据用户名查询 保证用户名唯一

}
  • 1
  • 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

6、UserServiceImpl 继承BaseServiceImpl

同样可以把BaseServiceImpl中有的方法在UserServiceImpl中注释掉(删除) 
注意:

  • A、第4点中说到在BaseServiceImpl中需要调用userDao,但没办法直接实例化,需要调用service层时传进去的问题,那么就是在这里传,在service是通过@Resource拿到IOC容器中userDao的, 
    B、 @Resource可以放在private UserDao userDao;上面,也可以放在public void 
    setUserDao(UserDao userDao)上面, 
    C、我们需要传userDao到BaseServiceImpl中,通过supper调用父类即BaseServiceImpl的setUserDao方法, 
    D、这样就把userDao传进到BaseServiceImpl中,避免空指针异常。
package cn.tax.nsfw.user.service.impl;
import java.io.FileInputStream;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import cn.tax.core.service.impl.BaseServiceImpl;
import cn.tax.nsfw.user.dao.UserDao;
import cn.tax.nsfw.user.entity.User;
import cn.tax.nsfw.user.service.UserService;

@Service("userService")
public class UserServiceImpl extends BaseServiceImpl<User>  implements UserService {
    private UserDao userDao;
    @Resource
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
        super.setBaseDao(userDao);
    }
    /*public void save(User user) {
        userDao.save(user);
    }
    public void delete(User user) {
        userDao.delete(user);
    }
    public void update(User user) {
        userDao.update(user);
    }
    public User findById(Serializable id) {
        return userDao.findById(id);
    }
    public List<User> getAll() {
        return userDao.getAll();
    }*/
    public List<User> findLike(User user) {
        return userDao.findLike(user);
    }
    public User findByName(String userName) {
        return userDao.findByName(userName);
    }

}
  • 1
  • 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
MyBatis-Plus是一个基于MyBatis的代码生成框架,它简化了数据库操作,通过注解使得开发更为简洁。当你想要自定义Service的行为,特别是当需要对基础的CRUD操作进行扩展时,可以考虑重写Service。 重写MyBatis-Plus的Service主要是为了覆盖其默认提供的`BaseService`模板方法。例如,你可以: 1. **拦截保存和更新操作**:在`save()`或`updateById()`方法中添加额外的业务逻辑,如数据验证、事务处理等。 ```java @Override public Result save(@Param("entity") YourEntity entity) { // 自定义验证和事务处理 if (isValid(entity)) { result = super.save(entity); if (result.isSuccess()) { // 其他业务处理 } } else { return Result.error("数据无效"); } return result; } ``` 2. **自定义分页查询**:如果你需要更复杂的分页逻辑,可以在`PageHelper.startPage()`之前或之后进行自定义设置。 ```java List<YourEntity> list = yourMapper.selectList(null); // 自定义分页逻辑 list = customPagination(list, PageVo pageVo); ``` 3. **动态加载关联数据**:利用`@Select`注解,你可以创建自定义的SQL查询,以获取更复杂的数据结构。 ```java @Select("SELECT a.*, b.* FROM table_a a LEFT JOIN table_b b ON a.id = b.table_a_id") List<CombinedEntity> selectWithRelations(@Param("id") Long id); ``` 记住,在重写时,保持接口兼容性和逻辑清晰是很重要的。同时,记得要在`MybatisPlusInterceptor`中注册你的Service,以便MyBatis-Plus能够找到并调用你的重写方法。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值