当前位置: 首页 > 软件库 > Web应用开发 > J2EE框架 >

MyFat

MyBatis DAO 增强工具
授权协议 Apache
开发语言 Java
所属分类 Web应用开发、 J2EE框架
软件类型 开源软件
地区 国产
投 递 者 宗政小林
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

简介 | Intro

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

优点 | Advantages

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

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

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

与其它MyBatis插件的区别

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

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

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

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

  5. 实体注解更符合JPA标准

  6. 文档少,是的,文档少也是优点,因为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环境下的配置和使用

作者其它开源项目 | Other Projects

期望 | Futures

欢迎发issue提出更好的意见或提交PR,帮助完善MyFat

版权 | License

Apache 2.0

关注我 | About Me

Github
码云

 相关资料
  • 铅笔工具已经过改进,便于更好地进行曲线拟合、路径自动关闭、绘制受控与不受控直线段。 铅笔工具 预设 双击“工具箱”中的“铅笔”工具图标,以打开“铅笔工具选项”对话框。“保真度”滑块具有四个预设可供选择。最左侧的滑块预设(精确)用于绘制最精确的路径。最右侧的滑块预设(平滑)用于创建最平滑的路径。选择最适合您绘图需要的预设。<b>(左图)</b> Illustrator CC (v17.x) <br/

  • 我正在逐个迭代字符串对象列表中的元素: 在这里,每次我调用list上的get()时,列表都会从其一端一直迭代到第i个元素——因此上面循环的复杂性是O(n^2)。 是a.)对于增强型for循环,与上面相同,还是b.)对于循环,将指针保持在最后一个指针所在的位置,因此下面循环的复杂性是O(n)? 如果上面的情况(b)——我想是这样的——在列表上使用迭代器有什么好处吗。这是简单的迭代--没有回头路 蒂亚

  • “铅笔”工具已经恢复了 Illustrator 早期版本中的工具所具备的优良、精细的控制功能。 增强的“铅笔工具选项”对话框 增加了一个“保真度”预设 “保真度”滑块目前有 5 个预设。现在已增加了一个新的滑块预设(最准确的预设),可以帮助您绘制出最准确的可能路径。同时,这个新增加的预设已被添加到“平滑工具选项”对话框。 使用 Alt 键可以切换到平滑工具选项 选中此复选框后,使用“铅笔”工具或“

  • ZGC 或 Z 垃圾收集器是在 Java 11 中引入的,作为一种低延迟垃圾收集机制。ZGC 确保垃圾收集暂停时间不依赖于堆大小。无论堆大小是 2MB 还是 2GB,它都不会超过 10 毫秒。 但是 ZGC 在将未使用的堆内存返回给操作系统方面存在限制,例如 G1 和 Shenandoah 等其他 HotSpot VM GC。以下是使用 Java 13 完成的增强功能: ZGC 默认将未提交的内存

  • 我有一个手风琴,它在我的页面内工作得很好。当你点击标题时,隐藏的div会显示,当你再次点击它时,它会再次隐藏。我想通过增加一个功能来增强手风琴,使手风琴一次只显示一个项目。换句话说,如果我打开了一个项目,并单击另一个标题,则当前打开的项目将自动关闭。 这是HTML 这是我的jQuery代码 如您所见,我有一个main(div class=“cap”)后跟一个(div class=“capitalo

  • 除了agent和环境之外,强化学习的要素还包括策略(Policy)、奖励(reward signal)、值函数(value function)、环境模型(model),下面对这几种要素进行说明: 策略(Policy) ,策略就是一个从当环境状态到行为的映射; 奖励(reward signal) ,奖励是agent执行一次行为获得的反馈,强化学习系统的目标是最大化累积的奖励,在不同状态下执行同一个行

  • 我有以下ElasticSearch DSL查询 我希望在与字段匹配时提高得分,也希望在字段匹配时降低得分。 我试过很多事情,比如: 或 但不能让它工作。我也尝试过将should和must等结合起来,但并没有走得太远--甚至不值得分享。有没有一种简单的方法可以做到这一点,而不需要重新对我所有的文档进行重新德行/重新打分?使用ES查询(而不是ES-DSL)的答案也会很有帮助。

  • Java 是静态语言。但是 JVM 却不那么静态。静态语言的好处是,IDE 可以提供很高级的重构功能。缺点是你的代码 会比较僵化,像 Javascript 一样的动态语言(或者说,后绑定语言),在编写程序时的随心所欲,估计 Java 程序员 是享受不到了。 但是好在 Java 还提供了“反射”。 在任何时候,你如果想在运行时决定采用哪个实现类,或者调用哪个方法,通过反射都可以实现,虽然不那么方便