就以Mapper.xml来说 , Mybatis将sql与代码分离了 , 但是你在项目里还是将Mapper.xml和代码放在同一个模块下 , 那这个优势就没有了 。既然没有这个优势 , 我们还有必要单独写Mapper.xml文件吗?我的选择是 , 那就不写了 , 直接使用Mybatis提供的注解 。
同时为了解决Service层对DAO层(这里也就是对Mybatis)的强依赖 , 对框架进行了一些改进 , 解耦Service和DAO层 。具体见下面的改进方案 。
框架改进方案为了解决上面这些问题 , 对框架进行了如下调整:
- 分离Param、Result和Model
- 替换代码生成
- 独立业务逻辑
- Model层优化
上面已经提到了Param、Result和Model强耦合会有很多问题 , 所以这里就将Param、Result和Model分离开 。每个都是独立的Bean , 这就解决了上面几个问题 。但是引入了两个新问题:
- 首先 , 很明显的 , 增加了手动编码的量 。当一个表修改了字段 , 需要修改三个类甚至更多的类
- 其次 , 增加了数据传递之间的代码 。即Param传递到Model , 需要对字段赋值 。如果一个字段一个字段的设值 , 会增加很多无聊的代码 。而使用反射的话会对性能有一些影响
对于赋值来说 , Spring提供了BeanUtils来简化处理 , 虽然是基于反射来设值的 , 但是对于现阶段来说 , 这点性能损耗还是没什么影响的 。但是 , BeanUtils对于不同类型的属性不能进行拷贝 , 假设我有一个Domain对象Book , 里面有个字段Author , 现在我要赋值给BookResult , 其中有个字段AuthorResult , 此时BeanUtils是无法赋值的 。所以我编写了一个基于Gson的工具类来处理 , 性能测试10000次的属性拷贝BeanUtils需要500多毫秒 , 基于Gson的工具类只需要300毫秒左右 。
对于表字段的生成 , 如果使用的是IDEA的话 , IDE默认提供了一个脚本 , 可以从表来生成POJO!我们可以使用这个脚本来生成Model , 然后将字段拷贝到Param和Result中 , 来简化字段的编写 。我对这个脚本进行了修改 , 以符合项目需求 。主要增加了lombok的支持 , 新增了类注释和字段注释 。
替换代码生成
对于上面代码生成组件的问题 , 我调整了代码生成的方式 。不再基于组件来生成 , 而是基于IDEA本身的FileTemplate、LiveTemplate以及Scripted Extensions来进行生成 。虽然这样的方式 , 不能够一次性生成多个文件 , 但是由于生成逻辑基本是一次性的 , 所以影响不是很大 。在初次生成代码时 , 代码生成组件的效率是高于FileTemplate、LiveTemplate以及Scripted Extensions的组合 , 但是后期调整的灵活性 , 明显是FileTemplate、LiveTemplate以及Scripted Extensions的组合要高于代码生成组件的:
- 首先 , 当文件结构调整时 , 只需要修改FileTemplate , 并将配置文件导出给项目组成员即可 。
- 同样的 , 当LiveTemplate调整时 , 也只需要修改对应的LiveTemplate , 并将配置文件导出给项目组成员即可 。
- 其次 , 想生成哪个文件 , 只要针对这个文件生成即可
- 第三 , 通过FileTemplate生成完整的文件后 , 可以通过LiveTemplate快速的进行模块化的编码
推荐阅读
- mysql优化实战:千万级数据表如何进行分页查询?
- Java 类在 Tomcat 中是如何加载的?
- 你如何看待生活中的茶文化
- 淘宝app如何显示全屏 淘宝页头怎么设置全屏
- 杯茶是如何征服世界的
- 如何避免类目错放 错放类目玩法
- 如何理解饮食和品茶的不同文化
- 淘宝小站怎么申请 淘宝分享小站如何开通
- 淘宝新店怎么做起来? 淘宝新店如何做起来
- 云南红茶有什么特点如何购买云南红茶