提要

本文是 小小商城-SSM 版的 细节详解系列 之一,项目 github:https://github.com/xenv/S-mall-ssm 本文代码大部分在 github 中 可以找到。

在中小型项目 I 中,我们常常使用 mybatis-generator 直接生成实体类、mapper、example 代码。但是,在实际开发中,我们有可能会需要增加实体类的变量(比如一些前台的临时变量和一对多、多对一变量等等),修改 mapper 代码,如果在机器生成的代码上面直接修改,那么我们下次修改了数据库,想重新生成的时候就会覆盖掉旧的手写代码了。所以必须要想出一种解决办法来隔离生成代码和额外增加代码。

最简单的方法,就是使用 IDE 的插件,但是这种方法没有普适性,可能换一个 IDE 就傻眼了,或者在实际部署的时候,也不一定有 IDE 的环境 ,所以这种做法可行,但是不是太好。

一般的方法,就是 另起炉灶,开一个 Extension 类 / VO 类,再继承机器生成的类。如下图。然而,这种方法意味着 mapper 也要 重写,工作量大不说,还很容易出错,也不容易管理,使用 mybatis-generator 的意义也不是太大。

传统方式

在这里,我提出了一种新的解决方案,如下图:

这种方法的巧妙之处在于,Service 层调用的就是机器直接生成的代码,而让机器的代码去继承我们自己写的代码,这样,mapper 不用额外写,example 也可以支持,调用的时候又隐藏了 实体扩展类,干净整洁。

具体实现

具体实现其实非常简单。小小商城的完整配置见 generatorConfig.xml

1. 修改 mybatis-generator 设置 ,让生成的实体类继承我们手写 Extension

mybatis-generator 其实支持我们直接去继承指定的类,只要在 table 配置中加入 “rootClass” 一行即可

1
2
3
4
5
6
<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 类,重新生成代码即可