mybatis-generator使用备忘

最近要做一个新的项目,项目涉及的业务还比较复杂,表相当多。项目使用的技术框架为SSM。于是决定使用mybatis-generator来生成DAO层大部分代码。使用的过程中遇到一些问题,这里小计一下。

实体对象属性为枚举

为了避免硬编码,希望生成的实体对象有的属性尽量使用枚举。

可以先定义一个枚举。

UserStatus.java

public enum UserState implements CodeTypeEnum<UserState> {
    ENABLED((byte)0),
    DISABLED((byte)1);

    private final Byte code;

    UserState(Byte code) {
        this.code = code;
    }

    @Override
    public Byte getCode(){
        return this.code;
    }
}

然后在MBG的配置文件中加入

<table tableName="user" escapeWildcards="true">
    <columnOverride column="user_status" javaType="personal.jeremyxu.entity.enums.UserState" />
</table>

还需要给枚举定义TypeHandler,TypeHandler的代码比较简单,这里为了以后其它枚举能复用,写了一个范式化的TypeHandler

CodeTypeHandler.java

public class CodeTypeHandler <E extends CodeTypeEnum> extends BaseTypeHandler<E> {

    private Map<Byte, E> enumMap = new HashMap<Byte, E>();

    public CodeTypeHandler(Class<E> type) {

        E[] enums = type.getEnumConstants();
        if (enums == null) {
            throw new IllegalArgumentException(type.getSimpleName() + " does not represent an enum type.");
        }

        for(E e : enums){
            enumMap.put(e.getCode(), e);
        }

    }

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException {
        ps.setByte(i, parameter.getCode());
    }

    @Override
    public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
        Byte code = rs.getByte(columnName);
        return enumMap.get(code);
    }

    @Override
    public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        Byte code = rs.getByte(columnIndex);
        return enumMap.get(code);
    }

    @Override
    public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        Byte code = cs.getByte(columnIndex);
        return enumMap.get(code);
    }
}

然后其它具体某个枚举的TypeHandler就可以这么写了

UserStateTypeHandler.java

public class UserStateTypeHandler extends CodeTypeHandler<UserState> {
    public UserStateTypeHandler() {
        super(UserState.class);
    }
}

最后在MyBatis配置里添加TypeHandler的注册

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mapperLocations" value="classpath:personal/jeremyxu/mapper/*.xml" />
    <property name="typeHandlersPackage" value="personal.jeremyxu.entity.enums.handlers" />
</bean>

定制MBG生成的代码

MBG提供大量的参数用来定制生成的代码,还提供插件机制,方便其它开发者开发插件来定制生成的代码。

我这里的配置如下:

<context id="default" targetRuntime="MyBatis3">
    ...
    <!-- 为生成的实体类添加equals,hashCode方法 -->
    <plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin" />
    <!-- 为生成的实体类添加toString方法 -->
    <plugin type="org.mybatis.generator.plugins.ToStringPlugin" />
    <!-- 修改生成的Example类的类名,将其中的Example修改为Criteria -->
    <plugin type="org.mybatis.generator.plugins.RenameExampleClassPlugin">
        <property name="searchString" value="Example$" />
        <property name="replaceString" value="Criteria" />
    </plugin>
    <!-- 修改生成的Mapper类中的方法名或参数名,将方法中的Example修改为Criteria,参数中的example修改为criteria -->
    <plugin type="personal.jeremyxu2010.mybatis.plugins.RenameExampleClassAndMethodsPlugin">
        <property name="classMethodSearchString" value="Example" />
        <property name="classMethodReplaceString" value="Criteria" />
        <property name="parameterSearchString" value="example" />
        <property name="parameterReplaceString" value="criteria" />
    </plugin>
    <!-- 使生成的Example类支持setOffset, setLimit方法,以便分页 -->
    <plugin type="personal.jeremyxu2010.mybatis.plugins.MySQLLimitPlugin" />
    <!-- 将生成的Example类放到filters包下,不跟实体类混在一起 -->
    <plugin type="personal.jeremyxu2010.mybatis.plugins.CreateSubPackagePlugin">
        <property name="exampleSubPackage" value="filters" />
        <property name="exampleClassSuffix" value="" />
    </plugin>

    <commentGenerator>
        <!-- 生成的注释中不带时间戳 -->
        <property name="suppressDate" value="true" />
        <!-- 将数据库中列的注释生成到实体的属性注释里,这个很重要 -->
        <property name="addRemarkComments" value="true" />
    </commentGenerator>

    <javaModelGenerator targetPackage="${modelPackage}" targetProject="${targetProject}">
        <!-- 是否对model添加构造函数 -->
        <property name="constructorBased" value="false" />
        <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
        <property name="enableSubPackages" value="false" />
        <!-- 建立的Model对象是否 不可改变  即生成的Model对象不会有 setter方法,只有构造方法 -->
        <property name="immutable" value="false" />
        <!-- 是否对类CHAR类型的列的数据进行trim操作 -->
        <property name="trimStrings" value="true" />
    </javaModelGenerator>

    <!-- escapeWildcards设置为true可以帮助抵御SQL注入 -->
    <table tableName="user" escapeWildcards="true">
        <columnOverride column="user_status" javaType="personal.jeremyxu.entity.enums.UserState" />
    </table>
    ...
</context>

生成数据库中的TEXT字段

在表的配置中添加columnOverride即可,如下

1

<columnOverride column="text_column" jdbcType="VARCHAR" />

参考项目

这里提供了一个示例工程对上述说到的内容作了演示,地址在这里

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android 研究

APK安装流程详解14——PMS中的新安装流程上(拷贝)补充

mContext.enforceCallingOrSelfPermission(android.Manifest.permission.INSTALL_PACK...

2541
来自专栏IT笔记

SpringBoot开发案例之整合mongoDB

JDK1.7、Maven、Eclipse、SpringBoot1.5.2、mongodb3.4,Robomongo(可视化工具)

6626
来自专栏我的小碗汤

19 个很有用的 ElasticSearch 查询语句 篇一

为了演示不同类型的 ElasticSearch 的查询,我们将使用书文档信息的集合(有以下字段:title(标题), authors(作者), summary(...

1.8K5
来自专栏芋道源码1024

【追光者系列】HikariCP 源码分析之故障检测那些思考 fail fast &amp; allowPoolSuspension

由于时间原因,本文主要内容参考了 https://segmentfault.com/a/1190000013136251 ,并结合一些思考做了增注

2104
来自专栏lgp20151222

整理代码,将一些曾经用过的功能整合进一个spring-boot

由于本人的码云太多太乱了,于是决定一个一个的整合到一个springboot项目里面。

2083
来自专栏AhDung

【C#】分享基于Win32 API的服务操作类(解决ManagedInstallerClass.InstallHelper不能带参数安装的问题)

------------------201508250915更新------------------

1452
来自专栏Java3y

图书管理系统【部署开发环境、解决分类、图书、前台页面模块】

前言 巩固Servlet+JSP开发模式,做一个比较完整的小项目. 成果图 该项目包含了两个部分,前台和后台。 前台用于显示 ? 后台用于管理 ? 该项目可分为...

6274
来自专栏IT笔记

SpringBoot开发案例之整合mongoDB

? mongodb.jpg 开始前,建议大家去了解以下文章,当然不看也没问题: MongoDB从入门到“精通”之简介和如何安装 MongoDB从入门到“精通”...

5588
来自专栏ImportSource

微服务弹性框架hystrix-javanica详解(上)

Java语言相比其他语言有一些比较great的优点,那就是反射(refleaction)和注解(annotation)。 几乎所有的流行框架比如Spring, ...

49010
来自专栏我是攻城师

在Lucene或Solr中实现高亮的策略

3785

扫码关注云+社区

领取腾讯云代金券