shigen
坚持更新文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。
个人IP:shigen
趁着下午的空闲时间,研究了一下mybatis-flex
,看着对我还是挺有吸引力的。于是打开了官网,先从代码生成开始:
代码生成
都是按照官方给的代码案例,
导入依赖
基本上都是很熟悉的依赖,必备的数据库连接JDBC、数据库连接池工具:
<dependency><groupId>com.mybatis-flex</groupId><artifactId>mybatis-flex-codegen</artifactId><version>1.8.2</version>
</dependency><dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><version>4.0.3</version>
</dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.32</version>
</dependency>
代码生成
在官方给的代码案例上,稍微改了一下数据库的连接配置。
public class Codegen {public static void main(String[] args) {//配置数据源HikariDataSource dataSource = new HikariDataSource();dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/security?characterEncoding=utf-8");dataSource.setUsername("root");dataSource.setPassword("123456");//创建配置内容,两种风格都可以。GlobalConfig globalConfig = createGlobalConfigUseStyle1();//GlobalConfig globalConfig = createGlobalConfigUseStyle2();//通过 datasource 和 globalConfig 创建代码生成器Generator generator = new Generator(dataSource, globalConfig);//生成代码generator.generate();}public static GlobalConfig createGlobalConfigUseStyle1() {//创建配置内容GlobalConfig globalConfig = new GlobalConfig();//设置根包globalConfig.setBasePackage("com.gitee.shigen.mybatisflexdemo");//设置表前缀和只生成哪些表globalConfig.setTablePrefix("sys_");// globalConfig.setGenerateTable("tb_account", "tb_account_session");//设置生成 entity 并启用 LombokglobalConfig.setEntityGenerateEnable(true);globalConfig.setEntityWithLombok(true);//设置项目的JDK版本,项目的JDK为14及以上时建议设置该项,小于14则可以不设置// globalConfig.setJdkVersion(17);//设置生成 mapperglobalConfig.setMapperGenerateEnable(true);//可以单独配置某个列// ColumnConfig columnConfig = new ColumnConfig();// columnConfig.setColumnName("tenant_id");// columnConfig.setLarge(true);// columnConfig.setVersion(true);// globalConfig.setColumnConfig("tb_account", columnConfig);return globalConfig;}public static GlobalConfig createGlobalConfigUseStyle2() {//创建配置内容GlobalConfig globalConfig = new GlobalConfig();//设置根包globalConfig.getPackageConfig().setBasePackage("com.test");//设置表前缀和只生成哪些表,setGenerateTable 未配置时,生成所有表globalConfig.getStrategyConfig().setTablePrefix("tb_").setGenerateTable("tb_account", "tb_account_session");//设置生成 entity 并启用 LombokglobalConfig.enableEntity().setWithLombok(true).setJdkVersion(17);//设置生成 mapperglobalConfig.enableMapper();//可以单独配置某个列ColumnConfig columnConfig = new ColumnConfig();columnConfig.setColumnName("tenant_id");columnConfig.setLarge(true);columnConfig.setVersion(true);globalConfig.getStrategyConfig().setColumnConfig("tb_account", columnConfig);return globalConfig;}
}
运行测试类,生成对应的代码:
再来看下生成的代码:
基本上很符合我们用lombok
+mybatis plus
的规范了,接下来只需要专注业务逻辑的开发即可。
编码体验
选取官方的几个案例,测试一下使用的效果。
配置sql打印
<dependency><groupId>com.mybatis-flex</groupId><artifactId>mybatis-flex-spring-boot-starter</artifactId><version>1.8.2</version></dependency>
@Configuration
public class MyConfigurationCustomizer implements ConfigurationCustomizer {@Overridepublic void customize(FlexConfiguration configuration) {configuration.setLogImpl(StdOutImpl.class);}
}
测试代码
MyBatis-Flex 使用了 APT(Annotation Processing Tool)技术,在项目编译的时候,会自动根据 Entity 类定义的字段帮你生成 “ACCOUNT” 类以及 Entity 对应的 Mapper 类, 通过开发工具构建项目(如下图),或者执行 maven 编译命令:
mvn clean package
都可以自动生成。这个原理和 lombok 一致。
执行mvn clean package
之后,需要刷新一下mvn
,避免必要的包无法导入。
其实效果类似于lombok
,我们看一下生成的代码:
最后编写测试类测试一下。
查询
下边是根据ID进行查询:
@Resourceprivate UserMapper userMapper;@GetMapping(value = "test/user/{id}")public User getUserById(@PathVariable("id") String id) {QueryWrapper queryWrapper = QueryWrapper.create().select().where(USER.ID.eq(id));return userMapper.selectOneByQuery(queryWrapper);}
这样,一个简单的查询就可以完成。当然,官方的文档中,原生的sql查询也是可以的:
public interface UserMapper extends BaseMapper<User> {/*** 根据id查询用户信息** @param id id* @return 用户信息*/@Select(value = "select * from sys_user where id = #{id}")User getUserById(@Param("id") String id);
}
多条件查询
这里我就直接给出测试的代码了:
@GetMapping(value = "test/user/select")public List<User> getUserList() {QueryWrapper queryWrapper = QueryWrapper.create().select().where(USER.PASSWORD.isNotNull()).and(USER.NICKNAME.likeRight("张%")).and(USER.ENABLED.eq(true));return userMapper.selectListByQuery(queryWrapper);}
更新数据
删除就在这里不演示了。
说实话,shigen
在最开始并没有觉得这个框架的牛掰之处,无非就是抄写了mybatis-plus
的优点,无非就是写查询的条件就像写sql语句一样的丝滑了。最后看了文档,才发现它的妙处:连表查询。
时间关系,这次的分享就到此为止了,连表查询我将会给出详细的案例,期待和大家一起探讨。
与shigen一起,每天不一样!