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 并启用 Lombok
globalConfig.setEntityGenerateEnable(true);
globalConfig.setEntityWithLombok(true);
//设置项目的JDK版本,项目的JDK为14及以上时建议设置该项,小于14则可以不设置
// globalConfig.setJdkVersion(17);
//设置生成 mapper
globalConfig.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 并启用 Lombok
globalConfig.enableEntity()
.setWithLombok(true)
.setJdkVersion(17);
//设置生成 mapper
globalConfig.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 {
@Override
public 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进行查询:
@Resource
private 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一起,每天不一样!