Mybatis逆向工程的使用教程

分类:SpringBoot
作者:ZhouJianGuo
发布时间:2019年09月24日 17:40:22

  Mybatis逆向工程就是根据指定数据库内的指定数据表进行“逆向”导出,生成对应的Pojo类、Dao类以及mapper文件(sql语句映射配置文件),SpringBoot Maven工程使用操作步骤如下:

1.在pom.xml中添加Mybatis逆向工程的依赖。

<!--MyBatis逆向工程-->
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.6</version>
        </dependency>

2.创建一个工具类OverIsMergeablePulgin.java添加到util包下。

import org.mybatis.generator.api.GeneratedXmlFile;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;

import java.lang.reflect.Field;
import java.util.List;

/**
 * 避免MyBatiis重复生成的工具类
 */
public class OverIsMergeablePlugin extends PluginAdapter {
    @Override
    public boolean validate(List<String> warnings) {
        return true;
    }

    @Override
    public boolean sqlMapGenerated(GeneratedXmlFile sqlMap, IntrospectedTable introspectedTable) {
        try {
            Field field = sqlMap.getClass().getDeclaredField("isMergeable");
            field.setAccessible(true);
            field.setBoolean(sqlMap, false);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }
}

3.在resources文件夹根目录下创建一个mybatis逆向工程的配置文件generatorConfig.xml(注意:需要自行配置相关字段)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>

    <context id="DB2Tables" targetRuntime="MyBatis3">
        <!--避免生成重复代码的插件-->
        <plugin type="第二步工具类位置"/>

        <!--是否在代码中显示注释-->
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <!--数据库链接地址账号密码-->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://127.0.0.1:3306/数据库名称?characterEncoding=UTF-8" userId="用户名"
                        password="密码">
        </jdbcConnection>

        <!--生成pojo类存放位置-->
        <javaModelGenerator targetPackage="pojo类包名称" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <!--生成xml映射文件存放位置-->
        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!--生成mapper类存放位置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.zjg.blog.dao" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>

        <!--生成对应表及类名-->
        <table tableName="目标表" domainObjectName="生成pojo类名" enableCountByExample="false"
               enableUpdateByExample="true" enableDeleteByExample="true" enableSelectByExample="true"
               selectByExampleQueryId="false">
            <property name="useActualColumnNames" value="false"/>
            <generatedKey column="id" sqlStatement="JDBC"/>
            <columnRenamingRule searchString="is_" replaceString=""/>
        </table>
    </context>
</generatorConfiguration>

相关属性介绍:

tableName:要生成的表名

example:开启后,就会生成pojo对应的example类,可以实现复杂操作(where,orderby等sql操作)而不需要修改mapper配置文件

Example用法:1.创建一个example对象(每个实体都会有一个对应的example对象)2.调用example对象的criteria构造方法3.调用criteria的方法(例:critera.andUsernameIsEqualTo("test"))4.使用mapper对象的子方法,传入参数为example对象(例:usermapper.selectByExample(exmaple))注:此处返回对象为一个list,因为非主键查找会产生多个结果,故返回对象为一个list

useActualColumnNames:false 就会开启字段驼峰命名法映射,true则会直接使用数据库里的字段名(不推荐)。

genratedKey:重要,影响插入操作,是否使用自增键

columnRenameingRule:自定义字段生成名,searchString是正则表达式,replaceString是想要替换成的变量名称,根据阿里命名规约,一定要将is_xx字段映射成xx变量,原因是为了避免框架对isXXX变量getter和setter的异常生成,参考《阿里Java开发手册》。

注意:table 配置中,需要注意property、generatedKey以及columnRenamingRule的顺序,否则会报错。

4.创建一个MybatisGenerator.java,建议放在一个单独的包名下(generator包)

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class MybatisGenerator {

    public static void main(String[] args) throws Exception {
        String today = "2019-09-24";

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date now = sdf.parse(today);
        Date d = new Date();

        if (d.getTime() > now.getTime() + 1000 * 60 * 60 * 24) {
            System.err.println("——————未成成功运行——————");
            System.err.println("——————未成成功运行——————");
            System.err.println("本程序具有破坏作用,应该只运行一次,如果必须要再运行,需要修改today变量为今天,如:" + sdf.format(new Date()));
            return;
        }

        if (false)
            return;
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        InputStream is = MybatisGenerator.class.getClassLoader().getResource("generatorConfig.xml").openStream();
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(is);
        is.close();
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);

        System.out.println("生成代码成功,只能执行一次,以后执行会覆盖掉mapper,pojo,xml 等文件上做的修改");
    }
}

注意:由于具有破坏作用,所以需要配置时间,否则无法运行!

5.运行第四步main函数的结果

图1.运行结果

 

6.总结:mybatis逆向工程时,大致的思路了解后,其实很简单,example那一段刚开始看时比较难理解,但是example是一个很精巧的设计,它可以实现更加完善的高级操作,而不需要改动pojo类对应的mapper配置文件(添加新语句,由于特殊的操作需要单独写一个语句,时间久了,会导致mapper配置文件的冗余,降低可维护性,同时也会降低开发效率)。除此以外需要注意的是,字段转换时一定要把 useActualColumnNames 的属性设置为 false,建议库中字段使用下划线,程序部分使用驼峰法,这是一个编程规约,建议养成好习惯。还需要注意的是,对于is_xxx字段,在生成成员变量时,一定要配置 columnRenamingRule 属性把is_xxx字段转换成xxx变量,此做法是为了保证框架注入的稳定性,is方法冲突,这也是个编程规约,一定要养成习惯。

版权声明:本站所有文章除特别声明外,转载请注明出处!
本文最后修改于:2019-10-19 17:14:09
许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

发表评论
请先登录后再发表评论~
评论 共0条

当前日志还没有评论,赶紧成为第一个评论者吧!
{{articleCommentItem.username}}
评论于 {{articleCommentItem.createBy}}
{{articleCommentItem.content}}
{{replyItem.username}}
回复于 {{replyItem.createBy}}
@{{replyItem.targetUsername}} {{replyItem.content}}

@CopyRight 2019 ZhouJianGuo版权所有
苏ICP备19061991号