前言
後端業務開發,每個表都要用到單表的增刪改查等通用方法,而配置了通用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.dao
是dao
層的路徑。
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);
}
}
所有的service
和serviceImpl
都分別繼承BaseService
和BaseServiceImpl
,例如UserService
和UserServiceImpl
分別繼承BaseService
和BaseServiceImpl
:
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
。
以上兩個步驟缺一不可。