1. 提要
本文是 小小商城 - SSM 版的 细节详解系列 之一, 项目 github:https://github.com/xenv/S-mall-ssm 本文代码大部分在 github 中 可以找到
在中小型项目 I 中, 我们常常使用 mybatis-generator 直接生成实体类 mapperexample 代码但是, 在实际开发中, 我们有可能会需要增加实体类的变量 (比如一些前台的临时变量和一对多多对一变量等等), 修改 mapper 代码, 如果在机器生成的代码上面直接修改, 那么我们下次修改了数据库, 想重新生成的时候就会覆盖掉旧的手写代码了所以必须要想出一种解决办法来隔离生成代码和额外增加代码
最简单的方法, 就是使用 IDE 的插件, 但是这种方法没有普适性, 可能换一个 IDE 就傻眼了, 或者在实际部署的时候, 也不一定有 IDE 的环境 , 所以这种做法可行, 但是不是太好
一般的方法, 就是 另起炉灶, 开一个 Extension 类 / VO 类, 再继承机器生成的类如下图然而, 这种方法意味着 mapper 也要 重写, 工作量大不说, 还很容易出错, 也不容易管理, 使用 mybatis-generator 的意义也不是太大
在这里, 我提出了一种新的解决方案, 如下图:
这种方法的巧妙之处在于, Service 层调用的就是机器直接生成的代码, 而让机器的代码去继承我们自己写的代码, 这样, mapper 不用额外写, example 也可以支持, 调用的时候又隐藏了 实体扩展类, 干净整洁
2. 具体实现
具体实现其实非常简单小小商城的完整配置见 generatorConfig.xml
1. 修改 mybatis-generator 设置 , 让生成的实体类继承我们手写 Extension
mybatis-generator 其实支持我们直接去继承指定的类, 只要在 table 配置中加入 "rootClass" 一行即可
- <table tableName="category" domainObjectName="Category" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="true" selectByExampleQueryId="false">
- <property name="rootClass" value="tmall.pojo.extension.CategoryExtension"/>
- <property name="my.isgen.usekeys" value="true"/>
- <property name="useActualColumnNames" value="true"/>
- <generatedKey column="id" sqlStatement="JDBC"/>
- </table>
2 手动新建 Extension 类, 重新生成代码即可
来源: http://www.bubuko.com/infodetail-2512480.html