Skip to content

MyBatis热重载 beta

  • 如果使用MyBatisPlus请点击点击查看。
  • SQL打印可以通过打印执行SQL与耗时开启。
  • MyBatis目前支持在 Spring 环境下,其他情况未知。

Mapper热重载

识别方式

读取的是 @MapperScan 注解的包路径下的所有文件。

  • 必须是接口并且必须含有 org.apache.ibatis.annotations.Mapper 注解
  • 类或父类继承 com.baomidou.mybatisplus.core.mapper.BaseMapper 接口。

WARNING

因为是启动时修改字节码注入,目前不支持读取 @MapperScan 配置的变量内容,请写真正的包路径。

生效的配置如:
@MapperScan("io.github.future0923.test.dao")
@MapperScan("io.github.future0923.test.**.dao")
@MapperScan("io.github.future0923.test.**")
@MapperScan({"io.github.future0923.test.user.**.dao", "io.github.future0923.test.order.**.dao"})

不支持的配置如:
@MapperScan("${mybatis-plus.mapperPackage}")

热重载功能

Mapper 接口新增修改是会重新生成 Mapper 接口中的信息,如 注解方法等会重新生成代理类并注入到Spring Bean中,和重新启动的效果一样。当然也支持新增 Mapper 类

示例

新增示例

新增 Entity 文件

java
public class User {
    
    private Long id;

    private Long deptId;
    
    private String userName;

    private Integer age;
}

新增 Mapper 文件

java
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper {

    @Select("select user_name, count(1) from user group by user_name")
    Map<String, Integer> getUserCountByName();

    List<User> selectByNameAndAge(@Param("name") String name, @Param("age") Integer age);
}

新增 Xml 文件

xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="UserMapper">
    <select id="selectByNameAndAge" resultType="User">
        select * from dp_user where name = #{name} and age = #{age}
    </select>
</mapper>

新增 Service 文件使用 UserMapper 接口

java
@Service
public class UserService {
    
    private final UserMapper userMapper;
    
    public UserService(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    public Map<String, Integer> getUserCountByName() {
        return userMapper.getUserCountByName();
    }
    
    public List<User> selectByNameAndAge(String name, Integer age) {
        return userMapper.selectByNameAndAge(name, age);
    }
}

热重载之后,我们通过 调用方法功能 调用 UserMapper 和 UserService 新增的方法都可以正常执行。

修改示例

java
import org.apache.ibatis.annotations.Mapper;

public class User {
    
    private Long id;
    
    private Long deptId;
    
    private String userName;
    
    private Integer age;
    
}

@Mapper
public interface UserMapper {

    @Select("select id, dept_id, name, sex from user") 
    List<User> getAll(); 
    
    @Select("select user_name, count(1) from user group by user_name") 
    Map<String, Integer> getUserCountByName();  
    @Select("select sex, count(1) from user group by sex") 
    Map<String, Integer> getUserCountBySex();  

    List<User> selectByNameAndAge(@Param("name") String name, @Param("age") Integer age); 

    Integer selectCount(@Param("name") String name); 
    Long selectCount(@Param("name") String name, @Param("age") Integer age); 
}

修改 xml 文件

xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="UserMapper">
    <select id="selectByNameAndAge" resultType="User">
        select * from dp_user where name = #{name} and age = #{age}
    </select>

    <select id="selectCount" resultType="java.lang.Integer">
        select * from dp_user where name = #{name}
    <select id="selectCount" resultType="java.lang.Long">
        select * from dp_user where name = #{name} and age = #{age}
    </select>
</mapper>

热重载之后,我们通过 调用方法功能 调用 UserMapper 修改后的方法都可以正常执行。

Xml热重载

识别方式

获取xml资源文件变动(新增/修改)

  • 新增:通过MyBatis验证的xml文件
  • 修改:Configuration中loadedResources存在的xml资源

热重载功能

重新编译xml文件,并重新加载到Configuration中,让xml生效。

示例

新增示例

一般需要配合mapper使用,例子查看新增mapper

修改示例

一般需要配合mapper使用,例子查看修改mapper,单独修改xml中的内容可以正常执行。