MyBatis:Mybatis逆向工程问题记录

 1. 搭建逆向工程方法一

近日我在搭建springboot+mybatis+mysql 的整合项目(自己测试玩)的时候用到了mybatis的逆向工程,来这里记录一下我的菜鸟编码过程

首先我在maven中引入这些依赖

<dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.5</version>
</dependency>
<!-- mysql -->
<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.44</version>
</dependency>

这里的org.mybatis.generator是mybatis的自动生成类的工具,我的是generator-1.3.5搭配mysql-5.1.44

项目模块截图:

在resources文件下创建一个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>
    <!-- 引入配置文件 -->
    <properties resource="application.properties"/>

    <!-- 一个数据库一个context -->
    <context id="MysqlContext">
        <!-- 注释 -->
        <commentGenerator >
            <property name="suppressAllComments" value="false"/><!-- 是否取消注释 -->
            <property name="suppressDate" value="true" /> <!-- 是否生成注释代时间戳-->
        </commentGenerator>

        <!-- jdbc连接 -->
        <jdbcConnection driverClass="${spring.datasource.driver-class-name}"
                        connectionURL="${spring.datasource.url}" userId="${spring.datasource.username}"
                        password="${spring.datasource.password}" />

        <!-- 类型转换 -->
        <javaTypeResolver>
            <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) -->
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- 生成实体类地址 targetPackage是指定生成的路径 targetProject是项目的相对路径-->
        <javaModelGenerator targetPackage="com.boot.model"
                            targetProject="src\main\java" >
            <!-- 是否在当前路径下新加一层schema,eg:fase -->
            <property name="enableSubPackages" value="false"/>
            <!-- 是否针对string类型的字段在set的时候进行trim调用 -->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!-- 生成mapxml文件 targetPackage是指定生成的路径 targetProject是项目的相对路径-->
        <sqlMapGenerator targetPackage="com.boot.dao.mapper"
                         targetProject="src\main\java" >
            <!-- 是否在当前路径下新加一层schema,eg:fase -->
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>

        <!-- 生成mapxml对应client,也就是接口dao targetPackage是指定生成的路径 targetProject是项目的相对路径-->
        <javaClientGenerator targetPackage="com.boot.dao.mapper"
                             targetProject="src\main\java" type="XMLMAPPER" >
            <!-- 是否在当前路径下新加一层schema,eg:fase -->
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>

        <!-- 配置表信息 -->
        <table schema="test" tableName="user"
               domainObjectName="UserDataBase" enableCountByExample="false"
               enableDeleteByExample="false" enableSelectByExample="false"
               enableUpdateByExample="false">
            <!-- schema即为数据库名 tableName为对应的数据库表 domainObjectName是要生成的实体类 enable*ByExample
                是否生成 example类   -->

            <!-- 忽略列,不生成bean 字段 -->
            <!--<ignoreColumn column="FRED" />-->
            <!-- 指定列的java数据类型 -->
            <!--<columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />-->
        </table>

    </context>
</generatorConfiguration>

在generatorConfig.xml文件中有引用application.properties文件内的值,所以我们还需要在resources文件下建一个application.properties文件

application.properties:

server.port=8082

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=******

接下来就是编写一个Generator的生成实体的类来进行运行

package com.boot;

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.File;
import java.util.ArrayList;
import java.util.List;

public class Generator {
    public static void main(String[] args) throws Exception {
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        File configFile = new File("src/main/resources/generatorConfig.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
    }
}

本地运行编写的Generator类,就会自动生成相应的实体,mapper,mapper.XML了。

这是我的后台输出:

刷新一下项目就可以看到生成的类和mapper文件了。

重点注意:

1.数据库连接错误!

报错信息:

For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. 
You need either to explicitly disable SSL by setting useSSL=false, or 
set useSSL=true and provide truststore for server certificate verification.

解决办法: 

在mysql连接字符串url中加入ssl=true或者false即可,如下所示。
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false

2.日志正常输出!但是没有生成文件!!

首先要查看generator.xml文件的javaModelGenerator、sqlMapGenerator、javaClientGenerator标签内的 targetPackage、targetProject属性是否写对!!

如果正确在查看编写的Generator类内File文件路径是否正确!!切记查看正确! 作者吃了大亏……

 2. 搭建逆向工程方法二

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generate</artifactId>
            <version>2.3</version>
        </dependency>
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.28</version>
        </dependency>
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.0</version>
        </dependency>
package utils;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

/**
 * 数据库对象 代码生成器  mysql
 */
public class Generate {

    public static void main(String[] args) {
        AutoGenerator mpg = new AutoGenerator();
        GlobalConfig gc = new GlobalConfig();
        gc.setAuthor("guoCh");
        gc.setOutputDir("E://output"); // 输出目录
        gc.setFileOverride(true);
        gc.setActiveRecord(true);
        gc.setEnableCache(false);
        gc.setBaseResultMap(true);
        gc.setBaseColumnList(true);

        gc.setMapperName("%sDao");
        gc.setXmlName("%sDao");
        gc.setServiceName("%sService");

        mpg.setGlobalConfig(gc);

        // 数据源
        DataSourceConfig dsc = new DataSourceConfig();
        //数据库类型
        dsc.setDbType(DbType.ORACLE);

//        dsc.setTypeConvert(new MySqlTypeConvert(){//
//                public DbColumnType processTypeConvert(String fieldType){
//                    System.out.println("类型转换:" + fieldType);
//                    return super.processTypeConvert(fieldType);
//                }
//
//            }
//        );
        //数据库驱动
        dsc.setDriverName("com.oscar.Driver");
        dsc.setUsername("sysdba");
        dsc.setPassword("szoscar55");
        dsc.setUrl("jdbc:oscar://5.9.111.14:2003/OSRDB");
        mpg.setDataSource(dsc);

        StrategyConfig strategy = new StrategyConfig(); // 生成多个表
        strategy.setEntityTableFieldAnnotationEnable(true);
        // strategy.setNaming(NamingStrategy.no_change);
        String[] tableName = {"SCHEMA_STAGE_SETTING_EXECUTE"};
        strategy.setInclude(tableName); //表名
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        //  strategy.setEntityLombokModel(true); // get set
        strategy.setRestControllerStyle(true);
        mpg.setStrategy(strategy);
        PackageConfig pc = new PackageConfig();
        pc.setParent("com.tianzhi.req.dmd"); // 父包名
        pc.setEntity("entity.dto");
        pc.setMapper("mapper");
        pc.setService("service");
        pc.setController("controller");
        pc.setXml("mapper");
        mpg.setPackageInfo(pc);
        mpg.execute();
    }

}
原文地址:https://www.cnblogs.com/nhdlb/p/10904567.html