SpringBoot快速整合通用Mapper

小碼code發表於2022-07-11

前言

後端業務開發,每個表都要用到單表的增刪改查等通用方法,而配置了通用Mapper可以極大的方便使用Mybatis單表的增刪改查操作。

通用mapper配置

1、新增maven:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--通用mapper-->
<dependency>
  <groupId>tk.mybatis</groupId>
  <artifactId>mapper-spring-boot-starter</artifactId>
  <version>2.1.5</version>
</dependency>
<!-- pagehelp -->
<dependency>
  <groupId>com.github.pagehelper</groupId>
  <artifactId>pagehelper-spring-boot-starter</artifactId>
  <version>1.2.3</version>
</dependency>

2、Application啟動檔案新增MapperScan註解

在springboot啟動類新增 tk.mybatis包下MapperScan註解

import tk.mybatis.spring.annotation.MapperScan;

@SpringBootApplication
@MapperScan("com.springboot.dao")
public class Application extends SpringBootServletInitializer {

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}

其中com.springboot.daodao層的路徑。

3、Model新增註解

新增 Table註解和Id註解,

  • Table 填寫資料表名
  • id寫在主鍵欄位上

例如下方的User實體:

@Table(name = "t_user")
public class User {
    //主鍵
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)//自增
    private Integer id;  
}
  

4、建立MyMapper

import tk.mybatis.mapper.common.IdsMapper;
import tk.mybatis.mapper.common.Mapper;


public interface MyMapper<T> extends Mapper<T>, IdsMapper<T> {

}

需要實現的通用介面都寫在MyMapper的繼承類中,該類的包不能被MapperScan掃描到。

  • Mapper<T> 包含了大量的單表操作。
  • IdsMapper<T> 是通過多個id查詢和刪除的方法。

5、每個dao繼承步驟4的MyMapper

例如UserDao繼承MyMapper<User> :

public interface UserDao extends MyMapper<User> {
}

通用service

上面配置只是呼叫dao層可以有預設的增刪改查的方法,還是要在對應的service新增增刪查改,所以需要寫一個通用service,把公共的方法都抽象到一個基礎方法中。

BaseService.java介面:

public interface BaseService<T> {
    /**
     * 查詢所有
     *
     * @return 返回所有資料
     */
    List<T> selectAll();


    /**
     * 查詢資料數量
     * @return
     */
    int selectCount();

    /**
     * 新增
     *
     * @param t   實體
     *
     * @return
     */
    int save(T t);

    /**
     * 修改
     *
     * @param t
     *            實體
     * @return
     */
    int updateByPrimaryKey(T t);

    /**
     * 根據主鍵刪除
     *
     * @param t   主鍵
     *
     * @return
     */
    int deleteByPrimaryKey(int t);
}

BaseServiceImpl實現類:

public class BaseServiceImpl<T> implements BaseService<T> {


    @Autowired
    private MyMapper<T> mapper;

    @Override
    public List<T> selectAll() {
        return mapper.selectAll();
    }

    @Override
    public int selectCount() {
        return mapper.selectCount(null);
    }

    @Override
    public int save(T t) {
        return mapper.insert(t);
    }

    @Override
    public int updateByPrimaryKey(T t) {
        return mapper.updateByPrimaryKey(t);
    }

    @Override
    public int deleteByPrimaryKey(int t) {
        return mapper.deleteByPrimaryKey(t);
    }

}

所有的serviceserviceImpl都分別繼承BaseServiceBaseServiceImpl,例如UserServiceUserServiceImpl分別繼承BaseServiceBaseServiceImpl:

public interface UserService extends BaseService<User>{

}
@Service
public class UserServiceImpl extends BaseServiceImpl<User> implements UserService{

}

配置完成之後,在對應的controller呼叫,比如UserController:

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @PostMapping("/add")
    public Object add(User user) {
        userService.save(user);
        return null;
    }

    @PostMapping("/delete")
    public Object delete(@RequestParam Integer id) {
        userService.deleteByPrimaryKey(id);
        return null;
    }

    @PostMapping("/update")
    public Object update(User user) {
        userService.updateByPrimaryKey(user);
        return null;
    }

    @GetMapping("/detail")
    public User detail(@RequestParam Integer id) {
        User user = userService.selectById(id);
         return user;
    }

    @GetMapping("/list")
    public List<User> list() {
       List<User> list = userService.list();
       return list;
    }
}

總結

通用mapper:

  • 建立SpringBoot啟動檔案新增MapperScan,掃描dao層的包。
  • 建立MyMapper<T> 介面,根據自己需求繼承要用的介面,比如Mapper<T>
  • 每個dao介面繼承MyMapper<T>介面。

通用service

  • 建立BaseService介面。
  • BaseServiceImpl實現類,呼叫MyMapper<T>實現增刪改查方法。
  • 每個service介面和service實現類分別繼承BaseService介面和BaseServiceImpl實現類。
  • 每個controller就能呼叫通用方法。

遇到的問題

1、啟動報錯

required a bean of type 'com.jeremy.data.utils.MyMapper' that could not be found.

沒有找到MyMapper對應的bean,無法注入。

解決方案:
1、SpringBoot啟動檔案新增MapperScan註解。
2、每個dao介面都要繼承MyMapper

以上兩個步驟缺一不可

github原始碼

https://github.com/jeremylai7/springboot-bootstrap

相關文章