# topfox **Repository Path**: geekcheng_admin/topfox ## Basic Information - **Project Name**: topfox - **Description**: 在 srpingboot2.x.x 和MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 7 - **Created**: 2019-08-02 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 1. 目录 - [快速使用](https://gitee.com/topfox/topfox/blob/dev/guide/explain-sample.md) - [高级应用](https://gitee.com/topfox/topfox/blob/dev/guide/explain-question.md) - [TopFox配置参数](https://gitee.com/topfox/topfox/blob/dev/guide/explain-configuration.md) - [上下文对象](https://gitee.com/topfox/topfox/blob/dev/guide/explain-tools.md) - [核心使用](https://gitee.com/topfox/topfox/blob/dev/guide/explain-core.md) - [条件匹配器](https://gitee.com/topfox/topfox/blob/dev/guide/explain-condition.md) - [实体查询构造器](https://gitee.com/topfox/topfox/blob/dev/guide/explain-entityselect.md) - [流水号生成器](https://gitee.com/topfox/topfox/blob/dev/guide/explain-keybuild.md) - [数据校验组件](https://gitee.com/topfox/topfox/blob/dev/guide/explain-checkdata.md) - [更新日志组件](https://gitee.com/topfox/topfox/blob/dev/guide/explain-updatelog.md) - [自动填充组件](https://gitee.com/topfox/topfox/blob/dev/guide/explain-filldata.md) - [Response 返回结果对象](https://gitee.com/topfox/topfox/blob/dev/guide/explain-response.md) - [其他](https://gitee.com/topfox/topfox/blob/dev/guide/explain-other.md) ## 1.1. 必备 - 文中涉及的例子源码网址: https://gitee.com/topfox/topfox-sample - TopFox技术交流群 QQ: 874732179 ## 1.2. topfox 介绍 在 srpingboot2.x.x 和MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 编程规范参考《阿里巴巴Java开发手册》 借鉴mybaties plus部分思想 特性: - **无侵入**:只做增强不做改变,引入它不会对现有工程产生影响 - **损耗小**:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作 - **集成Redis缓存**: 自带Redis缓存功能, 支持多主键模式, 自定义redis-key. 实现对数据库的所有操作, 自动更新到Redis, 而不需要你自己写任何代码; 当然也可以针对某个表关闭. - **强大的 CRUD 操作**:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求 - **支持 Lambda 形式调用**:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错 - **支持主键自动生成**:可自由配置,充分利用Redis提高性能, 完美解决主键问题. 支持多主键查询、修改等 - **内置分页实现**:基于 MyBatis 物理分页,开发者无需关心具体操作,写分页等同于普通查询 - **支持devtools/jrebel热部署** - **热加载** 支持在不使用devtools/jrebel的情况下, 热加载 mybatis的mapper文件 - 内置全局、局部拦截插件:提供delete、update 自定义拦截功能 - **拥有预防Sql注入攻击功能** - **无缝支持spring cloud**: 后续提供分布式调用的例子 ## 1.3. topfox 使用 > 推荐上传到自有的maven-nexus服, 然后在业务项目进行以下依赖 ``` com.topfox topfox 1.2.6 pom import ``` # 2. 更新日志 ## 2.1. 版本1.2.6 更新日志 2019-08-02 1: 改动如下 ``` topfox的 RestSessionHandler 更名为 AbstractRestSessionHandler 建议原二级类库的 RestSessionConfig 更名为 RestSessionHandler 这样与 AbstractRestSession 在二级类库的实现类 RestSession 规范一致 ``` 2: AppContext优化 - AppContext.getAbstractRestSession 删除, 改为 AppContext.getRestSession - AppContext.getAbstractRestSessionHandler 删除, 改为 AppContext.getRestSessionHandler 优化前的使用方式: ```java @RestController @RequestMapping("/context") public class AppContextController { @GetMapping("/test1") public void test1() { RestSessionHandlerConfig restSessionHandlerConfig = (RestSessionHandlerConfig)AppContext.getAbstractRestSessionHandler(); //与 restSessionConfig.get()的获得的对象一样 RestSession restSession = (RestSession)AppContext.getAbstractRestSession(); } } ``` 优化后的使用方式: ```java @RestController @RequestMapping("/context") public class AppContextController { @GetMapping("/test1") public void test1() { RestSessionHandler restSessionHandler = AppContext.getRestSessionHandler(); //与 restSessionHandler.get()的获得的对象一样 获得当前线程的 RestSession对象 RestSession restSession = AppContext.getRestSession(); } } ``` 完整源码( 请注意源码中 "以下3种获取 useName 的方法" ): ```java @GetMapping("/test1") public void test1() { Environment environment = AppContext.environment(); RestSessionHandler restSessionHandler1 = AppContext.getRestSessionHandler(); //根据Class从IOC容器中获取 单实例 RestSessionHandler restSessionHandler2 = AppContext.getBean(RestSessionHandler.class); //与 restSessionConfig.get()的获得的对象一样 RestSession restSession1 = AppContext.getRestSession(); RestSession restSession2 = AppContext.getRestSession(RestSession.class); /** * 以下 3种 获取 useName 的方法 */ String useName; //1. 这样可以获取 RestSession 中定义的 getUserName 方法 useName = AppContext.getRestSession(RestSession.class).getUserName(); //2. 而下面的 getUserName idea 编译器报错 //useName = AppContext.getRestSession().getUserName(); //3. 这样也ok useName = restSession1.getUserName(); useName = restSession2.getUserName(); SysConfigRead configRead = AppContext.getSysConfig(); System.out.println(configRead); } ``` 源码请参考 topfox-sample ## 2.2. 版本1.2.5 更新日志 2019-07-30 - 驼峰处理类 CamelHelper ``` BeanUtil.toUnderlineName 删除, 用 CamelHelper.toUnderlineName 替代 BeanUtil.toCamelCase 删除, 用 CamelHelper.toCamel 替代 ``` - 解决 form-data 参数值丢失的问题, 即request.getParameterMap()获取不到值 ## 2.3. 版本1.2.4 更新日志 2019-07-24 全局缓存参数开关 ``` 新增 一级缓存开关 top.service.thread-cache 新增 二级缓存开关 top.service.redis-cache 删除 top.service.open-redis ``` 以下未完成 - insertGetKey 多主键赋值的问题 - 填充组件优化, 不考虑 ## 2.4. 版本1.2.3 更新日志 2019-07-23 已经完成 - 多主键的支持, 包括: 更新, 删除, 查询, 数据校验组件, 修改日志组件; - java远程调用返回空对象的处理; - 技术文档修改 ## 2.5. 版本1.2.2 更新日志 2019-07-18 请参考 << TopFox配置参数 >>中的描述, 增加配置3个参数 : - top.service.update-not-result-error - top.service.select-by-before-update - top.service.redis-log dto增加 addNullfields 方法, 请参考 <<常见问题>> 章节中的 "如何将指定字段的值更新为null" SimpleService.setFillDataHandler 方法作废. 不需要写代码, 会自动注入 填充对象FillDataHandler的实现类. 增加填充组件 FillDataHandler的文档, DataDTO void方法改为返回自身, DataDTO增加setValue方法, 可以对指定的字段赋值 ## 2.6. 版本1.2.0 更新日志 - updateBatch 方法的返回值 由int 改为 List< DTO > - BaseDao 作废删除, 增加 BaseMapper< DTO extends DataDTO > 代替 - AdvancedService< QTO extends DataQTO, DTO extends DataDTO > 改为
AdvancedService< M extends BaseMapper< DTO >, DTO extends DataDTO > - SimpleService 中 方法 setBaseDao 删除. 已经定义 baseMapper , 可访问开发者自定义Dao的方法 ## 2.7. 版本1.1.0 更新日志 ### 2.7.1. 上下文对象 - 在以后的版本中将删除 com.topfox.common.ApplicationContextProvider - 新增加 上下文对象 com.topfox.common.AppContaxt,静态方法如下: ``` getBean(Class clazz) getBean(String name,Class clazz) getRestSessionHandler() getAbstractRestSession() getSysConfig() environment() ``` ### 2.7.2. SimpleService 进行了改造和优化 新增方法 ``` List selectBatch(DataQTO qto) Response> selectPage(EntitySelect entitySelect) Response>> selectPageForMap(EntitySelect entitySelect) List selectBatch(DataQTO qto) Response> listPage(EntitySelect entitySelect) List listObjects(EntitySelect entitySelect) ``` ### 2.7.3. EntitySelect 和DataQTO EntitySelect 和 DataQTO 对 orderBy groupBy having 分页的支持 ### 2.7.4. ResponseCode 增加了多个 异常编码 保证 Topxfox抛出异常 的编码唯一性