java通用配置扩展示例(代码片段)

isea533 isea533     2022-12-06     309

关键词:

Java 通用配置
(一)设计
(二)JVM和环境变量实现
(三)用户配置实现
(四)版本配置实现
(五)集成 Spring
(六)扩展示例

本系列参考实现:

https://gitee.com/mybatis-mapper/config
https://github.com/mybatis-mapper/config

<dependency>
   <groupId>io.mybatis</groupId>
   <artifactId>mybatis-config</artifactId>
   <version>1.0.0</version>
</dependency>

前面的三、四、五各实现一种配置方式,只看到了代码,还没看到具体的使用效果,所以这一篇用一个具体的例子来演示如何使用用户配置和版本配置,通过单元测试来查看用法和效果。

我们先回到第一篇中的起因,mybaits-mapper 中不想在每个字段上增加注解,因此底层的 mybatis-provider 项目中增加了 style 样式,在实体上配置样式后,只要字段符合规则,就不需要加注解配置,没有这个功能前相当于字段名和表名是直接映射的,但是多数情况下,我们都希望字段和列能按照驼峰转下划线方式进行转换,所以这种方式就是新版本的默认值,为了理论上的兼容低版本,在低版本情况下默认方式为字段名直接就是列名,所以就会用到版本配置的功能,一般版本配置和用户配置是成对的,用户肯定想自己能指定默认值,选择版本只能兼容版本升级带来的变化。

下面就开始在 mybatis-provider 项目开始集成用户配置和版本配置。

用户配置

package io.mybatis.provider.config;

import io.mybatis.config.defaults.UserConfig;

/**
 * mybatis-provider 用户配置,优先级高于版本配置,可以覆盖版本默认值
 * <p>
 * 可以通过 provider.properties 属性指定自定义的配置路径或文件名
 *
 * @author liuzh
 */
public class ProviderUserConfig extends UserConfig 
  @Override
  protected String getConfigKey() 
    return "io.mybatis.provider.properties";
  

  @Override
  protected String getConfigName() 
    return "mybatis-provider";
  


逻辑都在 UserConfig 封装好了,这里只需要实现两个抽象接口。

用户可以通过 io.mybatis.provider.properties=配置文件 指定其他的路径或者文件名,不指定时会使用默认的 mybatis-provider 作为文件名。

版本配置

package io.mybatis.provider.config;

import io.mybatis.config.defaults.VersionConfig;

/**
 * mybatis-provider 提供的默认配置文件,支持根据版本选择
 *
 * @author liuzh
 */
public class ProviderVersionConfig extends VersionConfig 
  @Override
  protected String getConfigName() 
    return "mybatis-provider";
  

  @Override
  protected String getVersionKey() 
    return "io.mybatis.provider.version";
  


版本配置中,配置文件前缀使用的 mybatis-provider,用户可以通过 io.mybatis.provider.version=v1.0 方式选择要使用的默认版本。

src/main/resources 和类名相同的包路径下面有两个配置文件:

  1. mybatis-provider-v1.0.properties
    mybatis.provider.style=normal
    
  2. mybatis-provider-v2.0.properties
    mybatis.provider.style=lower_underscore
    

SPI 配置

在 在 src/main/resources 下面创建目录 META-INF,然后创建文件 io.mybatis.config.Config,内容为上面实现的两个接口:

io.mybatis.provider.config.ProviderVersionConfig
io.mybatis.provider.config.ProviderUserConfig

到这里用户配置和版本配置就实现好了,下面开始测试功能。

测试功能

先单独测试用户配置和版本配置,最后再针对 ConfigHelper 整体测试。

用户配置测试

在当前测试路径下创建用户配置 mybatis-provider.properties 文件,内容如下:

username=liuzh
email=abel533@gmail.com

编写测试方法如下:

@Test
public void testUserConfig() 
  Config config = new ProviderUserConfig();
  String username = config.getStr("username");
  Assert.assertEquals("liuzh", username);
  Assert.assertEquals("abel533@gmail.com", config.getStr("email"));

上面测试直接创建了 ProviderUserConfig,没有通过 ConfigHelper 的 SPI 创建,用户配置中的内容可以直接读取。

注意:ProviderUserConfig 中会从 ConfigHelper 读取配置文件名,所以可以通过 io.mybatis.provider.properties=配置文件 修改默认配置文件信息。

版本配置测试

在 Maven 的 src/test/java 下面执行代码时,由于测试代码和正式代码位置不同,会导致找不到版本配置文件,所以测试时需要注意将配置文件复制到 src/test/resources 下面一份,这里测试的内容和上面一样:

@Test
public void testVersionConfig() 
  Config config = new ProviderVersionConfig();
  String style = config.getStr("mybatis.provider.style");
  Assert.assertEquals("lower_underscore", style);

  // 通过配置指定版本,也可以 JVM 中 -Dio.mybatis.provider.version=v1.1
  System.setProperty("io.mybatis.provider.version", "v1.1");
  config = new ProviderVersionConfig();
  style = config.getStr("mybatis.provider.style");
  Assert.assertEquals("normal", style);
  // 清除配置,避免对其他测试产生影响
  System.clearProperty("io.mybatis.provider.version");

测试代码分为两部分,第一部分默认使用最新的版本配置,第二部分指定了版本号。

ConfigHelper 集成测试

@Test
public void test() 
  Assert.assertEquals("liuzh", ConfigHelper.getStr("username"));
  Assert.assertEquals("abel533@gmail.com", ConfigHelper.getStr("email"));
  Assert.assertEquals("lower_underscore", ConfigHelper.getStr("mybatis.provider.style"));

为了验证用户配置优先级高于版本配置,在上面增加的 mybatis-provider.properties 文件添加配置如下:

username=liuzh
email=abel533@gmail.com
# 增加配置,覆盖版本配置
mybatis.provider.style=upper_underscore

此时获取的值就变了:

Assert.assertEquals("upper_underscore", ConfigHelper.getStr("mybatis.provider.style"));

除了这些外,你还可以配合 JVM 和环境变量进行测试。由于 mybatis-provider 中的测试环境没有 Spring,所以在另一个地方测试 Spring 配置。

Spring 集成测试

mybatis-mapper-example-springboot 示例中,修改启动类,增加获取配置信息的代码:

package io.mybatis.example.springboot;

import io.mybatis.config.ConfigHelper;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MapperSpringbootApplication implements CommandLineRunner 

  public static void main(String[] args) 
    SpringApplication.run(MapperSpringbootApplication.class, args);
  

  @Override
  public void run(String... args) throws Exception 
    System.out.println(ConfigHelper.getStr("mybatis.provider.style"));
  
  

直接运行上面代码后,输出内容如下:

lower_underscore

在 application.yaml 配置增加下面属性的设置:

mybatis:
  mapper-locations: classpath*:mappers/*.xml
  # 追加的内容
  provider:
    style: upper

再次运行输出如下:

upper

比如增加一些 Spring 特有的配置信息:

System.out.println(ConfigHelper.getStr("spring.datasource.url"));

会输出:

jdbc:mysql://localhost:3306/test?useSSL=false

使用 generator 下面的代码生成器随意生成一些 mybatis-mapper 的代码,然后测试上面 style 的效果。

CREATE TABLE `simple` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

生成实体默认带着所有注解,去掉不必要的注解后如下:

@Entity.Table(value = "simple", autoResultMap = true)
public class Simple 
  @Entity.Column(id = true)
  private Long id;

  private String name;

在配置文件中给 Mapper 包配置为 TRACE 方便查看日志:

logging:
  level:
    io.mybatis.example.springboot.mapper: TRACE

在启动类注入对应的 Mapper,然后调用方法:

@Autowired
SimpleMapper simpleMapper;

@Override
public void run(String... args) throws Exception 
  Simple simple = new Simple();
  simple.setName("liuzh");
  System.out.println(simpleMapper.insert(simple));

输出的日志如下:

i.m.e.s.mapper.SimpleMapper.insert       : ==>  Preparing: INSERT INTO simple(ID,NAME) VALUES (?,?)
i.m.e.s.mapper.SimpleMapper.insert       : ==> Parameters: null, liuzh(String)
i.m.e.s.mapper.SimpleMapper.insert       : <==    Updates: 1

可以看到 upper 配置起到了作用,也就是 mybatis-mapper 中获取配置时,已经可以拿到 Spring Boot 的配置,可以正常通过这种方式配置 mybatis-mapper。

小结

上次写 VFS - 代码生成器预览功能实现 时,就因为写文章改过很多代码,此次也不例外,本来 mybais-config 1.0.0 已经正式发布了,mybatis-provider 使用 mybatis-config 后也发布了 2.0.0 版本,在找时间发布 mybatis-mapper 就可以了。写文章过程中有过一些修改,又增加了不少工作量,后续经过审查后会发布 1.1.0 版本,mybatis-provider 也要有新版本发布,开源不管项目大小,都需要投入很多精力,确实很累,如果你看完这个系列后,有新的想法,欢迎 PR。

本系列参考实现:

https://gitee.com/mybatis-mapper/config
https://github.com/mybatis-mapper/config

<dependency>
   <groupId>io.mybatis</groupId>
   <artifactId>mybatis-config</artifactId>
   <version>1.0.0</version>
</dependency>

java通用配置1.1.0版本发布(代码片段)

Java通用配置(一)设计(二)JVM和环境变量实现(三)用户配置实现(四)版本配置实现(五)集成Spring(六)扩展示例本系列参考实现:https://gitee.com/mybatis-mapper/config 查看详情

java通用配置1.1.0版本发布(代码片段)

Java通用配置(一)设计(二)JVM和环境变量实现(三)用户配置实现(四)版本配置实现(五)集成Spring(六)扩展示例本系列参考实现:https://gitee.com/mybatis-mapper/config 查看详情

java示例代码_通过Hibernate反向工程扩展超类,使其具有通用的getter/setter

java示例代码_通过Hibernate反向工程扩展超类,使其具有通用的getter/setter 查看详情

java通用配置用户配置实现(代码片段)

Java通用配置(一)设计(二)JVM和环境变量实现(三)用户配置实现本系列参考实现:https://gitee.com/mybatis-mapper/confighttps://github.com/mybatis-mapper/config用户配置用户和版本配置都需要读取文件,但是两 查看详情

java通用配置用户配置实现(代码片段)

Java通用配置(一)设计(二)JVM和环境变量实现(三)用户配置实现本系列参考实现:https://gitee.com/mybatis-mapper/confighttps://github.com/mybatis-mapper/config用户配置用户和版本配置都需要读取文件,但是两 查看详情

java通用配置集成spring(代码片段)

Java通用配置(一)设计(二)JVM和环境变量实现(三)用户配置实现(四)版本配置实现(五)集成Spring本系列参考实现:https://gitee.com/mybatis-mapper/confighttps://github.com/my 查看详情

java通用配置集成spring(代码片段)

Java通用配置(一)设计(二)JVM和环境变量实现(三)用户配置实现(四)版本配置实现(五)集成Spring本系列参考实现:https://gitee.com/mybatis-mapper/confighttps://github.com/my 查看详情

java示例代码_:通用数组创建

java示例代码_:通用数组创建 查看详情

java通用配置设计(代码片段)

本系列参考实现:https://gitee.com/mybatis-mapper/confighttps://github.com/mybatis-mapper/config起因有用户提出mybatis-mapper能不能不在字段上加这么多注解,很麻烦,陆陆续续有不少用户都提到了这个。最初设计必须加就是为了防止tk-... 查看详情

java通用配置设计(代码片段)

本系列参考实现:https://gitee.com/mybatis-mapper/confighttps://github.com/mybatis-mapper/config起因有用户提出mybatis-mapper能不能不在字段上加这么多注解,很麻烦,陆陆续续有不少用户都提到了这个。最初设计必须加就是为了防止tk-... 查看详情

java通用配置设计(代码片段)

本系列参考实现:https://gitee.com/mybatis-mapper/confighttps://github.com/mybatis-mapper/config起因有用户提出mybatis-mapper能不能不在字段上加这么多注解,很麻烦,陆陆续续有不少用户都提到了这个。最初设计必须加就是为了防止tk-... 查看详情

java示例代码_如何使代码块通用

java示例代码_如何使代码块通用 查看详情

pythontouchdesigner-通用代码分割-generalext-示例(代码片段)

查看详情

pythontouchdesigner-通用代码分割-jobext-示例(代码片段)

查看详情

java示例代码_实现一个通用方法

java示例代码_实现一个通用方法 查看详情

java示例代码_实现多个通用接口

java示例代码_实现多个通用接口 查看详情

java示例代码_如何:创建通用列表

java示例代码_如何:创建通用列表 查看详情

java示例代码_实现通用分页

java示例代码_实现通用分页 查看详情