- 引入依赖
- 创建表
- 创建数据库表对应的 Entity 类
- 配置数据源
- 测试
- 总结
Fluent Mybatis 实战
接下来,我们来看看如何使用 Fluent Mybatis 来实现增删改查。
引入依赖
新建 Maven 工程,设置项目编译级别为 Java8 及以上,引入 Fluent Mybatis 依赖包。
<dependencies>
<!-- 引入fluent-mybatis 运行依赖包, scope为compile -->
<dependency>
<groupId>com.github.atool</groupId>
<artifactId>fluent-mybatis</artifactId>
<version>1.9.3</version>
</dependency>
<!-- 引入fluent-mybatis-processor, scope设置为provider 编译需要,运行时不需要 -->
<dependency>
<groupId>com.github.atool</groupId>
<artifactId>fluent-mybatis-processor</artifactId>
<version>1.9.3</version>
</dependency>
</dependencies>
创建表
create schema fluent_mybatis;
create table hello_world
(
id bigint unsigned auto_increment primary key,
say_hello varchar(100) null,
your_name varchar(100) null,
gmt_created datetime DEFAULT NULL COMMENT '创建时间',
gmt_modified datetime DEFAULT NULL COMMENT '更新时间',
is_deleted tinyint(2) DEFAULT 0 COMMENT '是否逻辑删除'
) ENGINE = InnoDB
CHARACTER SET = utf8 comment '简单演示表';
创建数据库表对应的 Entity 类
创建数据库表对应的 Entity
类: HelloWorldEntity
, 你只需要简单的做 3 个动作:
- 根据驼峰命名规则命名
Entity
类和字段 HelloWorldEntity
继承 IEntity
接口类- 在
HelloWorldEntity
类上加注解 @FluentMybatis
@FluentMybatis
public class HelloWorldEntity extends RichEntity {
private Long id;
private String sayHello;
private String yourName;
private Date gmtCreated;
private Date gmtModified;
private Boolean isDeleted;
// get, set, toString 方法
@Override
public Class<? extends IEntity> entityClass() {
return HelloWorldEntity.class;
}
}
执行编译。
IDE 编译:

Maven 编译:mvn clean compile
Gradle 编译:gradle clean compile
配置数据源
- 数据源 DataSource 配置
- Mybatis 的 mapper 扫描路径
- Mybatis 的
SqlSessionFactoryBean
@ComponentScan(basePackages = "cn.org.atool.fluent.mybatis.demo1")
@MapperScan("cn.org.atool.fluent.mybatis.demo1.entity.mapper")
@Configuration
public class HelloWorldConfig {
/**
* 设置dataSource属性
*
* @return
*/
@Bean
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/fluent_mybatis?useUnicode=true&characterEncoding=utf8");
dataSource.setUsername("root");
dataSource.setPassword("password");
return dataSource;
}
/**
* 定义mybatis的SqlSessionFactoryBean
*
* @param dataSource
* @return
*/
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean;
}
@Bean
public MapperFactory mapperFactory() {
return new MapperFactory();
}
}
很简单吧,在这里,你即不需要配置任何 Mybatis xml 文件, 也不需要写任何 · 接口, 但你已经拥有了强大的增删改查的功能,并且是 Fluent API,让我们写一个测试来见证一下 Fluent Mybatis 的魔法力量!
测试
注入 HelloWorldEntity
对应的 Mapper
类: HelloWorldMapper
, 这个类是 Fluent Mybatis 编译时生成的。
使用 HelloWorldMapper
进行删除、插入、查询、修改操作。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = HelloWorldConfig.class)
public class HelloWorldTest {
/**
* Fluent Mybatis编译时生成的Mapper类
*/
@Autowired
HelloWorldMapper mapper;
@Test
public void testHelloWorld() {
/**
* 为了演示方便,先删除数据
*/
mapper.delete(mapper.query()
.where.id().eq(1L).end());
/**
* 插入数据
*/
HelloWorldEntity entity = new HelloWorldEntity();
entity.setId(1L);
entity.setSayHello("hello world");
entity.setYourName("Fluent Mybatis");
entity.setIsDeleted(false);
mapper.insert(entity);
/**
* 查询 id = 1 的数据
*/
HelloWorldEntity result1 = mapper.findOne(mapper.query()
.where.id().eq(1L).end());
/**
* 控制台直接打印出查询结果
*/
System.out.println("1. HelloWorldEntity:" + result1.toString());
/**
* 更新id = 1的记录
*/
mapper.updateBy(mapper.updater()
.set.sayHello().is("say hello, say hello!")
.set.yourName().is("Fluent Mybatis is powerful!").end()
.where.id().eq(1L).end()
);
/**
* 查询 id = 1 的数据
*/
HelloWorldEntity result2 = mapper.findOne(mapper.query()
.where.sayHello().like("hello")
.and.isDeleted().eq(false).end()
.limit(1)
);
/**
* 控制台直接打印出查询结果
*/
System.out.println("2. HelloWorldEntity:" + result2.toString());
}
}
输出:
1. HelloWorldEntity:HelloWorldEntity{id=1, sayHello='hello world', yourName='Fluent Mybatis', gmtCreate=null, gmtModified=null, isDeleted=false}
2. HelloWorldEntity:HelloWorldEntity{id=1, sayHello='say hello, say hello!', yourName='Fluent Mybatis is powerful!', gmtCreate=null, gmtModified=null, isDeleted=false}
神奇吧!我们再到数据库中查看一下结果

现在,我们已经通过一个简单例子演示了 Fluent Mybatis 的强大功能, 在进一步介绍 Fluent Mybatis 更强大功能前,我们揭示一下为啥我们只写了一个数据表对应的 Entity 类, 却拥有了一系列增删改查的数据库操作方法。
Fluent Mybatis 根据 Entity
类上 @FluentMybatis
注解在编译时, 会在 target 目录 class 目录下自动编译生成一系列文件:

这些文件的具体作用如下:
mapper/*Mapper
: Mybatis 的 Mapper
定义接口, 定义了一系列通用的数据操作接口方法。dao/*BaseDao
: Dao
实现基类, 所有的 DaoImpl
都继承各自基类 根据分层编码的原则,我们不会在 Service
类中直接使用 Mapper
类,而是引用 Dao
类。我们在 Dao
实现类中根据条件实现具体的数据操作方法。wrapper/*Query
: Fluent Mybatis 核心类, 用来进行动态 sql 的构造, 进行条件查询。wrapper/*Updater
: Fluent Mybatis 核心类, 用来动态构造 update
语句。helper/*Mapping
: Entity
表字段和 Entity
属性映射定义类helper/*Segment
: Query
和 Updater
具体功能实现, 包含几个实现: select
, where
, group by
, having by
, order by
, limit
IEntityRelation
: 处理 Entity
关联(一对一, 一对多, 多对多)关系的接口Ref
: 引用 Fluent Mybatis 生成的对象的快捷入口工具类
总结
上面只是 Fluent Mybatis 常规实现增删改查的方式,Fluent Mybatis 现在又推出了专门面向表单级的增删改查,声明即实现。官方说明:https://juejin.cn/post/7033388050012962852 。