# myfat **Repository Path**: scwork/myfat ## Basic Information - **Project Name**: myfat - **Description**: MyFat是MyBatis的DAO功能增强插件 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 9 - **Created**: 2018-12-18 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 

myfat-logo

MyFat让MyBatis更胖

maven code style

## 简介 | Intro MyFat是MyBatis的DAO功能增强插件,利用全功能持久层工具jSqlBox来补足MyBatis缺少的功能。MyFat需Java8或以上。 ## 优点 | Advantages 1. 无侵入性,透明式增强。对于使用MyBatis的项目只需要添加MyFat依赖即可,不用更改任何其它配置文件和代码,即使使用了其它插件如MyBatis-Plus等,依然可以用MyFat来增强。 2. 架构优秀。MyFat的源码只有7个类,开发时间只有两周,但实现的功能绝不比其它MyBatis插件少。这是因为它采用的是组合模式,即将另一个全功能持久层工具jSqlBox组合到MyBatis中,功能互补,而不是从头开发。内核和插件互不依赖,独立发展,提高了可维护性 。 3. 功能全。以下为增强后的功能: 跨数据库分页、DDl生成、实体源码生成、函数变换、主键生成、多种SQL写法、DataMapper、ActiveRecord、Tail、实体越级关联查询、主从、分库分表等。引入了MyFat后,可以说只要你能想到的SQL写法,一定已经包括进来了。(这么多SQL写法,是因为架构导致的结果,而不是为了绚技) ## 与其它插件的一些区别 1. 目的不一样,其它插件是为MyBatis锦上添花,这个插件目的是让使用者了解jSqlBox的功能,抢一抢MyBatis的市场,希望有朝一日将MyBatis从项目中踢出去,因为MyBatis的主要功能如SqlMapper、用XML管理SQL、条件查询器,在作者看来都是反模式(这也是为什么jSqlBox缺少这些功能),在jSqlBox中都有其它实现方式。 2. ActiveRecord可以只声明接口,不一定需要继承类,也不需要定义Mapper,更无侵入性 3. 没有专门的分页方法,但是所有SQL查询都可以分页,无侵入性 4. 支持的SQL写法更多,如参数内嵌式写法、实体越级关联查询等 5. 实体注解更符合JPA标准 ## 文档 | Documentation [中文](https://gitee.com/drinkjava2/myfat/wikis/pages) | [English](https://github.com/drinkjava2/myfat/wiki) | [JavaDoc](http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22myfat%22) ## 配置 | Configuration 在pom.xml中加入以下内容即可,注意MyFat必须先于MyBatis加载: ```xml com.github.drinkjava2 myfat 1.0.0 org.mybatis mybatis 3.4.6 ``` 如果在Spring环境下,则上面的第二项MyBatis依赖要改成Spring的: ``` org.mybatis.spring.boot mybatis-spring-boot-starter 1.3.2 ``` 总之MyFat必须先于MyBatis加载。 ## 入门 | 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, 也有增强的pintea系方法了 Assert.assertEquals(100, mapper.aCountAll(" where age>?", param(0), " and age 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了。 示例二中 new Customer().insert(); 这种ActiveRedord写法,不需要传入一个ctx参数,它的前提是设定了一个缺省全局上下文(SqlBoxContext),详见jSqlBox项目介绍及demo/myfat-springboot示例。 ## 示例 | Demo * [myfattest](../../tree/master/demo/myfattest) 演示纯MyBatis环境下,手工获取SqlSesion进行操作 * [myfat-springboot](../../tree/master/demo/myfat-springboot) 演示MyFat在SpringBoot环境下的配置和使用 ## 作者其它开源项目 | Other Projects - [Java持久层工具 jSqlBox](https://gitee.com/drinkjava2/jSqlBox) - [数据库方言工具 jDialects](https://gitee.com/drinkjava2/jdialects) - [一个独立的声明式事务工具 jTransactions](https://gitee.com/drinkjava2/jTransactions) - [一个微型IOC/AOP工具 jBeanBox](https://gitee.com/drinkjava2/jBeanBox) - [一个服务端布局工具 jWebBox](https://gitee.com/drinkjava2/jWebBox) ## 期望 | Futures 欢迎发issue提出更好的意见或提交PR,帮助完善MyFat ## 版权 | License [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0) ## 关注我 | About Me [Github](https://github.com/drinkjava2) [码云](https://gitee.com/drinkjava2)