JShop简介:jshop是一套使用Java语言开发的B2C网店系统,致力于为个人和中小企业提供免费、好用的网店系统。
项目主页:http://git.oschina.net/dinguangx/jshop
在线演示:
- 前台: http://jshop.ofmall.org:81/jshop
- 后台: http://jshop.ofmall.org:81/jshop/manage/user/login (admin/123456)
mybatis-generator生成的代码文件主要有:
(1)mapper映射文件
(2)client(如果mybatis是ClientMapper接口类,而ibatis2则是DAO和DAOImpl)
(3)model:即与数据库字段一一对应的POJO
(4)model example
为这些代码文件提供的与数据库交互的方法有:
countByExample deleteByExample deleteByPrimaryKey insert insertSelective selectByExampleWithBLOBs selectByExampleWithoutBLOBs selectByPrimaryKey updateByExampleSelective updateByExampleWithBLOBs updateByExampleWithoutBLOBs updateByPrimaryKeySelective updateByPrimaryKeyWithBLOBs updateByPrimaryKeyWithoutBLOBs
围绕这几类的代码文件,mybatis generaotr提供了高度可定制化的扩展点,如对这些文件如何生成注释提供了CommentGenerator,控制整个代码生成过程的Plugin等。
jshop在集成mybatis gerarator时,主要针对实际的使用情况,定制了代码注释生成器和控制生成哪些方法的Plugin
(1) CommentGenerator定制
CommentGenerator对代码中的注释生成过程进行拦截和扩展,注释的类型包括文档注释,属性注释,方法注释,日期注释,setter/getter注释等。实际上,大部分的注释都是无意义的,仅仅为了表明生成的时间和标示是自动生成的。所以jshop中对comment generator进行定制,只保留model bean中的field注释,取的是字段的comment,其他注释全部去除,如下:
具体定制的代码见CommentGeneratorExt
生成的model文件示例如下:
public class ArticleCatalog implements Serializable { /** ID */ private Integer id; /** 分类名称 */ private String name; /** 父级ID */ private Integer pid; /** 顺序 */ private Integer order; /** 类型 */ private String type; /** 分类编码 */ private String code; private static final long serialVersionUID = 1L; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name == null ? null : name.trim(); } public Integer getPid() { return pid; } public void setPid(Integer pid) { this.pid = pid; } public Integer getOrder() { return order; } public void setOrder(Integer order) { this.order = order; } public String getType() { return type; } public void setType(String type) { this.type = type == null ? null : type.trim(); } public String getCode() { return code; } public void setCode(String code) { this.code = code == null ? null : code.trim(); } }
(2) Plugin定制-生成的method取舍
为了减少可能出现的代码bug,去除了updateByExample,deleteByExample, updateByExampleSelective和deleteByExampleSelective相关的方法,因为这几个方法会根据条件批量更新数据库,容易引入潜在的bug,保留updateByPrimaryKey和deleteByPrimaryKey进行数据库更新操作。
具体代码见JshopCustomPlugin
(3) Plugin扩展-mapper代码生成的问题
默认情况下,不删除原来已经生成过的代码文件时,dao,model文件可以在再次生成时被覆盖,而mapper文件则不会,所以对plguin进行扩展,可以在再次生成代码文件时,将原mapper文件覆盖掉。
/** * mapper文件可被重写的插件,默认情况下,重新生成代码时,mapper文件不会被覆盖 * 通过参数mapperOverwrite决定是否覆盖mapper文件,该值默认为true */ public class MapperFileOverwritePlugin extends PluginAdapter { @Override public boolean validate(Listwarnings) { return true; } private boolean mapperOverwrite = true; @Override public void setProperties(Properties properties) { super.setProperties(properties); mapperOverwrite = Boolean.valueOf(properties.getProperty("mapperOverwrite", String.valueOf(mapperOverwrite))); } @Override public boolean sqlMapGenerated(GeneratedXmlFile sqlMap, IntrospectedTable introspectedTable) { if(mapperOverwrite){ try { Field mergedField = GeneratedXmlFile.class.getDeclaredField("isMergeable"); mergedField.setAccessible(true); mergedField.setBoolean(sqlMap, false); return true; } catch (Exception e){ e.printStackTrace(); } } return super.sqlMapGenerated(sqlMap, introspectedTable); } }
jshop自动生成代码规范:
所有生成的代码位于src/main/gen目录,如果需要扩展model或client文件,则在src/main/java下新建一个继承于生成的model或client类的新类;如果需要扩展mapper文件,则在src/main/resources/mapper/ext中新建mapper文件。以便于在数据库有变动时,可以再次调用代码生成程序重新生成相关的文件。