使用springboot+mybatis进行接口的开发,在开发的过程中发现crud操作总是重复的写多次,为了减少代码量,加快开发速度,想着办法将重复代码进行一次封装,这样可以极大的减少冗余代码,让代码更美观。
1 封装DAO
新建BaseDao,使用泛型概念,将实体类通过泛型传递使用。(示例代码里面的方法根据需要进行修改)
@Repository
public interface BaseDao<T> {
int insert(T t);
int update(T t);
int delete(int id);
List<T> list(@Param("index") int index, @Param("size") int size);
int size();
int status(@Param("id") int id, @Param("status") int status);
}
2 使用封装Dao
让UserDao继承BaseDao,并将User实体类通过泛型传递给BaseDao,这样BaseDao中泛型即作为User处理。
public interface UserDao extends BaseDao<User> {
}
对应的UserMapper.xml文件中,只要写对应BaseDao中的list()、insert()的sql即可。
<select id="list" resultType="User">...</select>
<insert id="insert">...</insert>
如果想更进一步将公共的service封装一下也可以。
3 封装sercice
新建BaseService,在BaseService调用BaseDao方法使用。
@Service
public abstract class BaseService<T> {
@Autowired
private BaseDao<T> baseDao;
// 添加
protected Callback insert(T t) {
int result = baseDao.insert(t);
if (result < 1) {
return Callback.error("操作失败");
}
return Callback.success();
}
// 修改
protected Callback update(T t) {
int result = baseDao.update(t);
if (result < 1) {
return Callback.error("操作失败");
}
return Callback.success();
}
// 启用/禁用
public Callback status(Integer id, Integer status) {
if(id == null || id < 1) {
return Callback.error("id不能为空");
}
if(status == null || status < 0) {
return Callback.error("状态不能为空");
}
int result = baseDao.status(id, status);
if(result < 1) {
return Callback.error("操作失败");
}
return Callback.success();
}
// 删除
public Callback delete(Integer id) {
if (id == null || id < 1) {
return Callback.error("参数异常");
}
int result = baseDao.delete(id);
if (result < 1) {
return Callback.error("操作失败");
}
return Callback.success();
}
// 列表
protected BaseVO<T> list(Integer page, Integer pageSize){
if (page == null || page < 1) {
page = 1;
}
if (pageSize == null || pageSize < 1) {
pageSize = 10;
}
int index = (page - 1) * pageSize;
int total = baseDao.size();
PageUtil pageUtil = new PageUtil(pageSize, total, page);
List<T> list = baseDao.list(index, pageSize);
BaseVO<T> baseVO = new BaseVO<T>();
baseVO.setList(list);
baseVO.setPageUtil(pageUtil);
return baseVO;
}
}
4 使用封装Service
让UserService继承BaseService,并将User实体类通过泛型传递给BaseService,这样BaseService中泛型即作为User处理。
@Service
public class UserService extends BaseService<User> {
// 获取用户列表
public Callback<BaseVO<User>> getUsers(Integer page, Integer pageSize) {
return Callback.success(list(page, pageSize));
}
// 保存用户
public Callback saveUser(User user, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return Callback.error(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
}
if (user.getId() == null || user.getId() < 1) {
return insert(user);
} else {
return update(user);
}
}
}
在上面的代码中写了getUsers(),saveUser()方法用于处理业务逻辑,这里仅是为了更好的适配业务需要,像其他的delete()等方法也可以直接通过userService.delete()调用,不用在UserService中编写。
通过以上对Dao和Service进行封装,我们只要关注sql语句,以及controller的调用,就可以将功能实现,极大的减少了我们代码编写量。
当然如果你使用mybatisPlus可以更好的减免sql的编写。