FluentMybatis实现mybatis动态sql拼装和fluent api语法

 更新时间:2021年08月04日 15:29:18   作者:tryternity  
本文主要介绍了FluentMybatis实现mybatis动态sql拼装和fluent api语法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

开始第一个例子: Hello World

 新建Java工程,设置maven依赖

新建maven工程,设置项目编译级别为Java8及以上,引入fluent mybatis依赖包。

<dependencies>
    <!-- 引入fluent-mybatis 运行依赖包, scope为compile -->
    <dependency>
        <groupId>com.github.atool</groupId>
        <artifactId>fluent-mybatis</artifactId>
        <version>1.3.1</version>
    </dependency>
    <!-- 引入fluent-mybatis-processor, scope设置为provider 编译需要,运行时不需要 -->
    <dependency>
        <groupId>com.github.atool</groupId>
        <artifactId>fluent-mybatis-processor</artifactId>
        <version>1.3.1</version>
    </dependency>
</dependencies>

新建演示用的数据库结构

create schema fluent_mybatis_tutorial;

create table hello_world
(
    id           bigint unsigned auto_increment primary key,
    say_hello    varchar(100) null,
    your_name    varchar(100) null,
    gmt_create   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 implements IEntity {
    private Long id;

    private String sayHello;

    private String yourName;

    private Date gmtCreate;

    private Date gmtModified;

    private Boolean isDeleted;
    
    // get, set, toString 方法
}

很简单吧,在这里,你即不需要配置任何mybatis xml文件, 也不需要写任何Mapper接口, 但你已经拥有了强大的增删改查的功能,并且是Fluent API,让我们写一个测试来见证一下Fluent Mybatis的魔法力量!

运行测试来见证Fluent Mybatis的神奇

为了运行测试, 我们还需要进行JUnit和Spring Test相关配置。

配置spring bean定义

 数据源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_tutorial?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;
    }
}

使用Junit4和Spring-test来执行测试

  • 使用spring-test初始化spring容器
  • 注入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()
            .update.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());
    }
}

执行Junit4测试方法,控制台输出

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语句。
  • entity/*EntityHelper: Entity帮助类, 实现了Entity和Map的转换方法
  • 辅助实现时, 实现fluent mybatis动态sql拼装和fluent api时内部用到的类,使用时无需了解
  • 在使用上,我们主要会接触到上述5个生成的java类。Fluent Mybatis为了实现动态拼接和Fluent API功能,还生成了一系列辅助类。
  • helper/*Mapping: 表字段和Entity属性映射定义类
  • helper/*SqlProviderP: Mapper接口动态sql提供者
  • helper/*WrapperHelper: Query和Updater具体功能实现, 包含几个实现:select, where, group by, having by, order by, limit

Fluent Mybatis文档&示例

Fluent Mybatis源码, github

到此这篇关于FluentMybatis实现mybatis动态sql拼装和fluent api语法的文章就介绍到这了,更多相关FluentMybatis实现mybatis动态sql内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MyBatis实践之DAO与Mapper

    MyBatis实践之DAO与Mapper

    MyBatis前身是iBatis,是一个基于Java的数据持久层/对象关系映射(ORM)框架.通过本文给大家介绍MyBatis实践之DAO与Mapper的相关知识,需要的朋友参考下吧
    2016-03-03
  • 使用maven的profile构建不同环境配置的方法

    使用maven的profile构建不同环境配置的方法

    这篇文章主要介绍了使用maven的profile构建不同环境配置的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • springBoot2.X配置全局捕获异常的操作

    springBoot2.X配置全局捕获异常的操作

    这篇文章主要介绍了springBoot2.X配置全局捕获异常的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 关于JAVA11中图片与BASE64相互转换的实现

    关于JAVA11中图片与BASE64相互转换的实现

    这篇文章主要介绍了关于JAVA11中图片与BASE64相互转换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Java三种获取redis的连接及redis_String类型演示(适合新手)

    Java三种获取redis的连接及redis_String类型演示(适合新手)

    这篇文章主要介绍了Java三种获取redis的连接及redis_String类型演示(适合新手),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • SpringBoot使用Shiro实现动态加载权限详解流程

    SpringBoot使用Shiro实现动态加载权限详解流程

    本文小编将基于 SpringBoot 集成 Shiro 实现动态uri权限,由前端vue在页面配置uri,Java后端动态刷新权限,不用重启项目,以及在页面分配给用户 角色 、 按钮 、uri 权限后,后端动态分配权限,用户无需在页面重新登录才能获取最新权限,一切权限动态加载,灵活配置
    2022-07-07
  • 老生常谈Scanner的基本用法

    老生常谈Scanner的基本用法

    下面小编就为大家带来一篇老生常谈Scanner的基本用法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • Springboot使用redis实现接口Api限流的示例代码

    Springboot使用redis实现接口Api限流的示例代码

    本文主要介绍了Springboot使用redis实现接口Api限流的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • SpringBoot项目后端开发逻辑全面梳理

    SpringBoot项目后端开发逻辑全面梳理

    这篇文章主要介绍了SpringBoot项目后端开发逻辑全面梳理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Java String index out of range:100错误解决方案详解

    Java String index out of range:100错误解决方案详解

    这篇文章主要介绍了Java String index out of range:100错误解决方案详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08

最新评论