共计 3561 个字符,预计需要花费 9 分钟才能阅读完成。
前言
后端业务开发,每个表都要用到单表的 增删改查 等通用办法,而配置了通用 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
。
以上两个步骤 缺一不可。
github 源码
https://github.com/jeremylai7/springboot-bootstrap