mybatis-plus-jpa-support

介绍

MybatisPlus 拥有像 Jpa 一样的直接在 mapper 接口中定义方法名(如 findByUserNameOrderByCreatedAsc )查询的能力(无需配置xml)

适用场景

假设有一个简单的场景,根据姓名查询用户并按照创建时间排序,如果用 mybatisplus 来写的话,需要用下面的代码来完成:

java 复制代码
LambdaQueryWrapper<SysUser> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.orderByAsc(SysUser::getCreated);
lambdaQueryWrapper.like(SysUser::getUserName, "赵");
mapper.selectList(lambdaQueryWrapper);

但是如果用 Jpa 来实现,代码就很简单了,只需要在 Repository接口 定义下面的方法,在 service 里直接就可以调用:

Java 复制代码
List<SysUser> findByUserNameOrderByCreatedAsc(String userName);

所以说,在某些场景下, Jpa 确实是比 MybatisPlus 更简单实用的。为了让 Mybatisplus 拥有 Jpa 的能力,你的项目中非常需要 mybatis-plus-jpa-support !!!

Maven 引入

项目地址:mybatis-plus-jpa-support

xml 复制代码
<!--基于jdk21,想要低版本的自行下载源码打包-->
<dependency>
    <groupId>com.xiaoyudeguang</groupId>
    <artifactId>mybatis-plus-jpa-support</artifactId>
    <version>1.0.2-SNAPSHOT</version>
</dependency>
使用教程
  1. 启动类声明 @EnableMybatisJpaSupport 注解
java 复制代码
import com.xiaoyudeguang.mybatis.jpa.annotation.EnableMybatisJpaSupport;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@MapperScan(basePackages = {"com.**.mapper"})
@EnableMybatisJpaSupport(basePackages = {"com.**.mapper"})
@SpringBootApplication
public class StartApp {

    public static void main(String[] args) {
        SpringApplication.run(StartApp.class, args);
    }
}
  1. 所有 mapper 接口的 @Mapper 注解都要替换为 @com.xiaoyudeguang.mybatis.jpa.support.annotation.Mapper 注解
java 复制代码
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xiaoyudeguang.mybatis.jpa.annotation.Mapper;

import java.util.List;

@Mapper
public interface SysUserMapper extends BaseMapper<SysUser> {
    
    List<SysUser> findByUserNoAndUserNameLike(String userNo, String userName);

    List<SysUser> findAllOrderByUserNoDesc(String userName);

    List<SysUser> findByUserNameLikeOrderByUserNoDesc(String userName);

    long countByUserName(String userName);

    List<SysUser> findByUserNameLike(String userName);

    List<SysUser> findByUserNameStartingWith(String userName);

    List<SysUser> findByUserNameContaining(String userName);

    void deleteByUserName(String userName);
}
  1. Service 中使用
java 复制代码
import com.example.mapper.SysUserMapper;
import com.example.model.SysUser;
import jakarta.annotation.Resource;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl {

    //注意,这里如果使用@Autowired注解,必须用@Qualifier("sysUserRepository")显示声明
    @Resource
    private SysUserMapper sysUserRepository;

    @Override
    public List<SysUser> testJpa(String userNo, String userName) {
        sysUserRepository.findByUserNoAndUserNameLike(userNo, userName);
        sysUserRepository.findByUserNameLike("findByUserNameLike");
        sysUserRepository.findAllOrderByUserNoDesc("findAllOrderByUserNoDesc");
        sysUserRepository.findByUserNameLikeOrderByUserNoDesc("findByUserNameLikeOrderByUserNoDesc");
        sysUserRepository.findByUserNameStartingWith("findByUserNameStartingWith");
        sysUserRepository.findByUserNameContaining("findByUserNameContaining");
        sysUserRepository.countByUserName("countByUserName");
        sysUserRepository.deleteByUserName("deleteByUserName");
        return List.of();
    }
}
  1. 通过继承抽象层 AbstractServiceImpl 类的来简化注入过程
java 复制代码
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiaoyudeguang.mybatis.jpa.annotation.Mapper;
import com.xiaoyudeguang.mybatis.jpa.web.mapper.AbstractMapper;
import com.xiaoyudeguang.mybatis.jpa.web.service.AbstractService;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.util.StringUtils;

/**
 * AbstractServiceImpl类可以直接复制到项目中当做Service层的抽象类
 */
public abstract class AbstractServiceImpl<M extends BaseMapper<T>, T> extends ServiceImpl<M, T> implements AbstractService<M, T>, InitializingBean {

    @Autowired
    private M baseMapper;

    protected M mapper;
    @Autowired
    protected ApplicationContext context;

    @Override
    @SuppressWarnings("unchecked")
    public void afterPropertiesSet() throws Exception {
        mapper = baseMapper;
        Class<?> mapperClass = baseMapper.getClass().getInterfaces()[0];
        String repositoryName = StringUtils.uncapitalize(mapperClass.getSimpleName().replace("Mapper", "Repository"));
        if (context.containsBean(repositoryName) && mapperClass.getDeclaredAnnotation(Mapper.class) != null) {
            mapper = (M) context.getBean(repositoryName);
        }
    }
}

@Service
public class UserServiceImpl extends AbstractServiceImpl<SysUserMapper, SysUser> implements UserService {

    @Override
    public List<SysUser> testJpa(String userNo, String userName) {
        //mapper接口中的自定义方法
        mapper.findByUserNoAndUserNameLike(userNo, userName);
        mapper.findByUserNameLike("findByUserNameLike");
        mapper.findAllOrderByUserNoDesc("findAllOrderByUserNoDesc");
        mapper.findByUserNameLikeOrderByUserNoDesc("findByUserNameLikeOrderByUserNoDesc");
        mapper.findByUserNameStartingWith("findByUserNameStartingWith");
        mapper.findByUserNameContaining("findByUserNameContaining");
        mapper.countByUserName("countByUserName");
        mapper.deleteByUserName("deleteByUserName");
        return List.of();
    }

}
相关推荐
indexsunny1 天前
互联网大厂Java求职面试实战:Spring Boot微服务与Kafka消息队列应用解析
java·数据库·spring boot·微服务·面试·kafka·jpa
山枕檀痕4 天前
JPA Projection 详解(接口投影 / 类投影 / 动态投影 / 原生SQL映射)
java·hibernate·jpa
九皇叔叔4 天前
【06】SpringBoot3 MybatisPlus 修改(Mapper)
java·spring boot·mybatis·mybatisplus
九皇叔叔8 天前
【02】SpringBoot3 MybatisPlus 加入日志功能
java·mysql·mybatis·日志·mybatisplus
没有bug.的程序员9 天前
Spring Boot 数据访问:JPA 与 MyBatis 集成对比与性能优化深度解密
java·spring boot·性能优化·mybatis·jpa·集成对比
indexsunny12 天前
互联网大厂Java求职面试实战:Spring Boot微服务与Kafka消息队列解析
java·spring boot·微服务·面试·kafka·jpa
子非鱼92113 天前
MyBatisPlus快速上手
数据库·spring boot·mybatisplus
lendsomething14 天前
Spring 多数据源事务管理,JPA为例
java·数据库·spring·事务·jpa
DCTANT19 天前
【原创】使用更优雅的方式改造MyBatisPlus逻辑删除插件
spring boot·后端·mysql·kotlin·mybatis·mybatisplus
七夜zippoe25 天前
ORM框架下的SQL优化 N+1问题识别与解决方案
自动化·mybatis·jpa·n+1·batch fetching