一、MyBatis-Flex

简单介绍

MyBatis-Flex 是一个优雅的 MyBatis 增强框架,它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用 Mybaits-Flex 链接任何数据库,其内置的 QueryWrapper^亮点 帮助我们极大的减少了 SQL 编写的工作的同时,减少出错的可能性。


总而言之,MyBatis-Flex 能够极大地提高我们的开发效率和开发体验,让我们有更多的时间专注于自己的事情。


特性

1、轻量


除了 MyBatis,没有任何第三方依赖轻依赖、没有任何拦截器,其原理是通过 SqlProvider 的方式实现的轻实现。同时,在执行的过程中,没有任何的 Sql 解析(Parse)轻运行。 这带来了几个好处:1、极高的性能;2、极易对代码进行跟踪和调试; 3、更高的把控性。


2、灵活


支持 Entity 的增删改查、以及分页查询的同时,MyBatis-Flex 提供了 Db + Row^灵活 工具,可以无需实体类对数据库进行增删改查以及分页查询。 与此同时,MyBatis-Flex 内置的 QueryWrapper^灵活 可以轻易的帮助我们实现 多表查询、链接查询、子查询 等等常见的 SQL 场景。


3、强大


支持任意关系型数据库,还可以通过方言持续扩展,同时支持 多(复合)主键、逻辑删除、乐观锁配置、数据脱敏、数据审计、 数据填充 等等功能。


基础方法

INSERT

BaseMapper 的接口提供了 insert 和 insertBatch 方法,用于新增数据。


insert(entity):插入实体类数据,不忽略 null 值。

insertSelective(entity):插入实体类数据,但是忽略 null 的数据,只对有值的内容进行插入。这样的好处是数据库已经配置了一些默认值,这些默认值才会生效。

insert(entity, ignoreNulls):插入实体类数据。

insertWithPk(entity):插入带有主键的实体类,不忽略 null 值。

insertSelectiveWithPk(entity):插入带有主键的实体类,忽略 null 值。

insertWithPk(entity, ignoreNulls):带有主键的插入,此时实体类不会经过主键生成器生成主键。

insertBatch(entities):批量插入实体类数据,只会根据第一条数据来构建插入的字段内容。

insertBatch(entities, size):批量插入实体类数据,按 size 切分。

insertOrUpdate(entity):插入或者更新,若主键有值,则更新,若没有主键值,则插入,插入或者更新都不会忽略 null 值。

insertOrUpdateSelective(entity):插入或者更新,若主键有值,则更新,若没有主键值,则插入,插入或者更新都会忽略 null 值。

insertOrUpdate(entity, ignoreNulls):插入或者更新,若主键有值,则更新,若没有主键值,则插入。

① insert

   /**

    * insert(entity):插入实体类数据,不忽略 null 值。

    * insert(entity, ignoreNulls):插入实体类数据。

    */

   @Test

   public void testInsert() {

       /**

        * 默认不忽略null值

        * INSERT INTO `tb_account`(`user_name`, `age`, `birthday`) VALUES (?, ?, ?)

        */

       int row = accountMapper.insert(new Account().setUserName(null).setBirthday(new Date()).setAge(25));

       Assertions.assertEquals(row, 1);

       /**

        * ignoreNulls true:忽略null , false:不忽略null

        * INSERT INTO `tb_account`(`user_name`) VALUES (?)

        */

       int row2 = accountMapper.insert(new Account().setUserName("ly3").setBirthday(null).setAge(null), true);

       Assertions.assertEquals(row2, 1);

   }


② insertSelective

   /**

    * insertSelective(entity):插入实体类数据,但是忽略 null 的数据,只对有值的内容进行插入。这样的好处是数据库已经配置了一些默认值,这些默认值才会生效。

    */

   @Test

   public void testInsertSelective() {

       /**

        * INSERT INTO `tb_account`(`user_name`) VALUES (?)

        */

       int row = accountMapper.insertSelective(new Account().setUserName("陈远航").setAge(null));

       Assertions.assertEquals(row, 1);

   }

③ insertWithPk

   /**

    * insertWithPk(entity):插入带有主键的实体类,不忽略 null 值。

    */

   @Test

   public void testInsertWithPk() {

       /**

        * INSERT INTO `tb_account`(`id`, `user_name`, `age`, `birthday`) VALUES (?, ?, ?, ?)

        */

       int row = accountMapper.insertWithPk(new Account().setUserName("廖楷瑞").setId(5L).setBirthday(null));

       Assertions.assertEquals(row, 1);

   }

④ insertBatch

   /**

    * insertBatch(entities):批量插入实体类数据,只会根据第一条数据来构建插入的字段内容。

    * insertBatch(entities, size):批量插入实体类数据,按 size 切分。

    */

   @Test

   public void testInsertBatch() {

       List<Account> accounts = new ArrayList<>(10);

       for (int i = 0; i < 10; i++) {

           Account account = new Account().setUserName("ly" + i).setBirthday(new Date()).setAge(20 + i);

           accounts.add(account);

       }

       /**

        * 批量插入,可以指定每次插入的数据大小size

        * size=2 : INSERT INTO `tb_account`(`user_name`, `age`, `birthday`) VALUES (?, ?, ?), (?, ?, ?)

        * size=3 : INSERT INTO `tb_account`(`user_name`, `age`, `birthday`) VALUES (?, ?, ?), (?, ?, ?), (?, ?, ?)

        * ......

        */

       int rows = accountMapper.insertBatch(accounts, 2);

       System.out.println("rows = " + rows);

   }


⑤ insertOrUpdate

   /**

    * insertOrUpdate(entity):插入或者更新,若主键有值,则更新,若没有主键值,则插入,插入或者更新都不会忽略 null 值。

    * insertOrUpdateSelective(entity):插入或者更新,若主键有值,则更新,若没有主键值,则插入,插入或者更新都会忽略 null 值。

    * insertOrUpdate(entity, ignoreNulls):插入或者更新,若主键有值,则更新,若没有主键值,则插入。

    */

   @Test

   public void testInsertOrUpdate() {

       Account account = new Account().setUserName("ly-update2").setId(3L).setBirthday(new Date()).setAge(21);

       /**

        * UPDATE `tb_account` SET `user_name` = ? , `age` = ? , `birthday` = ? WHERE `id` = ?

        */

       int row = accountMapper.insertOrUpdate(account);

       Assertions.assertEquals(row, 0, 1);

       account = new Account().setUserName("ly-update2").setBirthday(null).setAge(21);

       /**

        * INSERT INTO `tb_account`(`user_name`, `age`) VALUES (?, ?)

        */

       int row2 = accountMapper.insertOrUpdateSelective(account);

       Assertions.assertEquals(row2, 0, 1);

   }