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();
    }

}
相关推荐
LSL666_3 天前
mybatisplus入门案例
数据库·mysql·mybatisplus
fanruitian5 天前
springboot-mybatisplus-demo
spring boot·后端·mybatis·mybatisplus
草原印象10 天前
Spring Boot Spring MVC MyBatis MyBatis Plus框架编写项目实战案例
spring boot·spring·mybatis·springmvc·mybatisplus
tgethe11 天前
MybatisPlus基础部分详解(中篇)
java·spring boot·mybatisplus
tgethe11 天前
MybatisPlus基础部分详解(上篇)
java·spring boot·mybatisplus
tgethe11 天前
MybatisPlus基础部分详解(下篇)
java·spring boot·mybatisplus
修行者Java1 个月前
JPA 的说明和使用
orm·jpa
拽着尾巴的鱼儿1 个月前
fixed-bug:JPA 关联关系的对象序列化循环引用问题
spring·bug·jpa
小葱拌豆腐~2 个月前
ShardingJDBC整合MybatisPlus的动态数据源
mybatisplus·动态数据源·shardingjdbc
色空大师2 个月前
【mybatisPlus详解】
java·mybatis·mybatisplus