- Fluent Mybatis 实战
- 引入依赖
- 创建表
- 创建数据库表对应的 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 。