A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

简介 | Intro

MyFat是MyBatis的DAO功能增强插件,利用全功能持久层工具jSqlBox来补足MyBatis缺少的CRUD功能。

优点 | Advantages
  • 无侵入性,透明式增强。对于使用MyBatis的项目只需要添加MyFat依赖即可,不用更改任何其它配置文件和代码,即使使用了其它插件如MyBatis-Plus等,依然可以用MyFat来增强。

  • 架构优秀。MyFat的源码只有7个类,开发时间只有两周,但实现的功能绝不比其它MyBatis插件少。这是因为它采用的是组合模式,即将另一个全功能持久层工具jSqlBox组合到MyBatis中,功能互补,而不是从头开发。内核和插件是独立的,互不依赖,可维护性好 。

  • 功能全。以下为增强后的功能:
    跨数据库分页、DDl生成、实体源码生成、函数变换、主键生成、多种SQL写法、DataMapper、ActiveRecord、Tail、实体越级关联查询、主从、分库分表等。引入了MyFat后,可以说只要你能想到的SQL写法,一定已经包括进来了。(这么多种SQL写法,是因为架构导致的,不是为了炫技)


与其它MyBatis插件的区别
  • 目的不一样,其它插件是为MyBatis锦上添花,这个插件的目的是让使用者了解一下jSqlBox的功能,抢一抢MyBatis的市场,希望有朝一日将MyBatis从项目中踢出去,因为MyBatis的几个主要功能如SqlMapper、用XML管理SQL、条件查询器,在作者看来都是反模式,在jSqlBox中都有不同的实现方式。之所以叫MyFat这个名字,是因为MyBatis已经够胖了(1.6M),再给它增点肥也没关系了。

  • ActiveRecord可以只声明接口,不一定需要继承类,也不需要定义Mapper,更无侵入性

  • 没有专门的分页方法,但是所有SQL查询都可以分页,无侵入性

  • 支持的SQL写法更多,如参数内嵌式写法、实体越级关联查询等

  • 实体注解更符合JPA标准

  • 文档少,是的,文档少也是优点,因为MyFat源码只有7个类,你指望它会有多少文档? 使用MyFat需要查阅jSqlBox的用户手册,但是这个与MyBatis已经没有一毛钱关系了。


文档 | Documentation

中文 |  JavaDoc

配置 | Configuration

MyFat需Java8支持,在pom.xml中加入以下内容即可,注意MyFat必须先于MyBatis加载:

<dependency>     <groupId>com.github.drinkjava2</groupId>     <artifactId>myfat</artifactId>     <version>1.0.0</version> <!--或最新版-->  </dependency>  <dependency>      <groupId>org.mybatis</groupId>      <artifactId>mybatis</artifactId>      <version>3.4.6</version> <!--或最新版-->  </dependency>

如果在Spring环境下,则上面的MyBatis依赖项要改成Spring的:

  <dependency>      <groupId>org.mybatis.spring.boot</groupId>      <artifactId>mybatis-spring-boot-starter</artifactId>          <version>1.3.2</version> <!--或最新版-->   </dependency>示例 | First Example

以下示例演示了MyFat的使用,至于SqlSessionFactory的配置,与标准MyBatis的配置一模一样(透明式增强),略去。完整的源码可见Demo目录下的myfattest:

SqlSession session = sqlSessionFactory.openSession(false);try {    // SqlSession有了增强的SQL方法,jSqlBox中的pinte系列方法可用    Assert.assertEquals(50, session.iQueryForLongValue("select count(*) from user_tb where age>", ques(50),            " and age <= ", ques(200)));    Assert.assertEquals(100, session.eCountAll(User.class, " where age>0"));    UserMapper mapper = session.getMapper(UserMapper.class);    // 如果mapper继承于RootMapper<User>, 也有增强的pintea系方法了    Assert.assertEquals(100, mapper.aCountAll(" where age>?", param(0), " and age<?", param(200)));        Helper.pagin(2, 15);// 无侵入的分页    try {        List<User> users = mapper.getUsersOlderThan(50);        Assert.assertEquals(15, users.size());    } finally {        Helper.clear();    }    new User().insert(session.ctx());// ActiveRecord写法     new Tail().putTail("id", "1").insert(session.ctx(), tail("user_tb")); // Tail相当于jFinal中的Record    session.ctx().iExecute("insert into user_tb (id) values(?)", param('a'));    session.iExecute("insert into user_tb (id) values(?)", param('b'));    mapper.iExecute("insert into user_tb (id) values(?)", param('c'));    mapper.insertOneUser("d");} catch (Exception e) {    System.out.println("Exception:" + e.getMessage());} finally {    session.close();}

上例是手工进行SqlSession的获取和关闭,适用于纯MyBatis环境。如果在Spring或SpringBoot环境下,则有以下写法示例:

@Transactional    public void insertWithDiv0() {        for (int i = 0; i < 100; i++)            new Customer().putField("name", "Foo" + i).insert();        Assert.assertEquals(15, new Customer().findAll(" where name<>''", pagin(2, 15)).size());        customerMapper.insertByIdAndName("2", "Sam");        customerMapper.iExecute("insert into customer (id,name) values (?,?)", param("3", "Tom"));        iExecute("insert into customer (id,name) values (?,?)", param("4", "Cat"));        new Customer().insert();         Assert.assertEquals(104, new Customer().countAll());        System.out.println(1 / 0);    }

Mapper由Spring注入,采用声明式事务,不需要手工获取和管理SqlSession。

示例2中 new Customer().insert(); 这种ActiveRedord写法,不需要传入一个ctx参数,它的前提是设定了一个缺省全局上下文(SqlBoxContext),详见jSqlBox项目介绍及demo/myfat-springboot示例。

示例 | Demo
  • myfattest 演示纯MyBatis环境下,手工获取SqlSesion和Mapper进行操作

  • myfat-springboot 演示MyFat在SpringBoot环境下的配置和使用



转自 开源中国地址 https://www.oschina.net/p/myfat


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马