美文网首页IT@程序员猿媛SpringBoot精选
MyBatis使用main文件,简单粗暴的逆向生成,挺全的配置注

MyBatis使用main文件,简单粗暴的逆向生成,挺全的配置注

作者: 程就人生 | 来源:发表于2019-10-02 09:31 被阅读0次

之前整理过一篇 STS整合MyBatis generator 生成的两种方式,后来又看了其他朋友们整出来三种、四种MyBatis逆向生成的方式,现在也整一款实用的main方法文件生成,有了这个文件后,逆向生成又方便省力了许多。

本demo搭建环境:
springboot 2.1.4
jdk1.8
maven

首先,在pom文件中引入三个必须的架包。
一个mybatis和spring整合的架包,一个mysql数据库驱动架包,还有一个逆转工程的依赖架包,逆转工程的依赖架包也可以加到plugin里,这个根据个人喜好,本人比较喜欢加在dedependency里面。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.example</groupId>
  <artifactId>spirng-mybatis</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>spirng-mybatis</name>
  <description>Demo project for Spring Boot</description>
  <properties>
    <java.version>1.8</java.version>
  </properties>
  <dependencies>
      <!-- mybatis的依赖架包 -->
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>2.0.1</version>
    </dependency>
    <!-- mysql数据库驱动包 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <!-- Mybaits逆转工程依赖包 -->
    <dependency>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-core</artifactId>
    <version>1.3.2</version>
    </dependency>  
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

第二步,创建生成的配置文件,里面的注释需要好好看,根据需要进行设置。

<?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>

  <!-- 数据库驱动包位置,如果在pom文件中包含,此处就可以省略 -->
  <!-- <classPathEntry location="C:/maven_repo/mysql/mysql-connector-java/5.1.47/mysql-connector-java-5.1.47.jar" /> -->

  <!-- 使用properties替换generatorConfig.xml中的${propertyKey}
    resource:配置资源加载地址,使用resource,MBG从classpath开始找,比如com/myproject/generatorConfig.properties        
    url:配置资源加载地质,使用URL的方式,比如file:///C:/myfolder/generatorConfig.properties.两个选择一个即可;
    <properties resource="" url="" />
   -->
  
<!-- 
    context:生成一组对象的环境,也称上下文
    id:必选,上下文id,用于在生成错误时提示
    defaultModelType:指定生成对象的样式
        1,conditional:类似hierarchical;
        2,flat:所有内容(主键,blob)等全部生成在一个对象中;
        3,hierarchical:主键生成一个XXKey对象(key class),Blob等单独生成一个对象,其他简单属性在一个对象中(record class)
    targetRuntime:
        1,MyBatis3:默认的值,生成基于MyBatis3.x以上版本的内容,包括XXXBySample;
        2,MyBatis3Simple:类似MyBatis3,只是不生成XXXBySample;
    introspectedColumnImpl:类全限定名,用于扩展MBG
-->
  <context id="context" >
    <!-- 自动识别数据库关键字,默认false,如果设置为true,根据SqlReservedWords中定义的关键字列表;一般保留默认值,遇到数据库关键字(Java关键字),使用columnOverride覆盖 -->
    <property name="autoDelimitKeywords" value="false"/>
    <!-- 生成的Java文件的编码 -->
    <property name="javaFileEncoding" value="UTF-8"/>
    <!-- 格式化java代码 -->
    <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
    <!-- 格式化XML代码 -->
    <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>
    
    <!-- beginningDelimiter和endingDelimiter:指明数据库的用于标记数据库对象名的符号,比如ORACLE就是双引号,MYSQL默认是`反引号;选填项 -->
    <!--  <property name="beginningDelimiter" value="`"/><property name="endingDelimiter" value="`"/> -->
  
  <commentGenerator>

  <!-- 是否去除自动生成的注释 true:是,false:否 -->
  <property name="suppressAllComments" value="true"/>
  
  <!-- 是否去除所有自动生成的文件的时间戳,默认为false -->
  <property name="suppressDate" value="true"/>

  </commentGenerator>

  <!-- 数据库连接配置 -->
  <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8" userId="root" password="123456" >

  <!--设置可以获取tables remarks信息 -->
  <property name="useInformationSchema" value="true"/>  
  
   <!--设置可以获取remarks信息 -->
   <property name="remarks" value="true" />  

  </jdbcConnection>  
  
  <!-- java类型解析处理器,用于处理DB中的类型到Java中的类型,默认使用JavaTypeResolverDefaultImpl;-->
    <javaTypeResolver type="org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl">        
        <property name="forceBigDecimals" value="false"/>
    </javaTypeResolver>  

  <!-- java模型创建器,是必须要的元素
             负责:1,key类(见context的defaultModelType);2,java类;3,查询类       
       targetPackage:生成在哪个包下,生成的类要放的包,真实的包受enableSubPackages属性控制;
       targetProject:生成在哪个工程下,目标项目,指定一个存在的目录下,生成的内容会放到指定目录中,如果目录不存在,MBG不会自动建目录
             当使用main进行生成时,这里必须写成绝对路径,不能写相对路径,需要注意的地方
        -->
  <javaModelGenerator targetPackage="com.example.demo.entity" targetProject="C:/Users/87620/Documents/workspace-sts-3.8.3.RELEASE/spirng-mybatis/src/main/java" >
    
       <!--  for MyBatis3/MyBatis3Simple 自动为每一个生成的类创建一个构造方法,构造方法包含了所有的field;而不是使用setter;-->
        <property name="constructorBased" value="false"/>
        
        <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
        <property name="enableSubPackages" value="true"/>
        
        <!-- for MyBatis3 / MyBatis3Simple 是否创建一个不可变的类,如果为true,那么MBG会创建一个没有setter方法的类,取而代之的是类似constructorBased的类  -->
        <property name="immutable" value="false"/>
        
        <!-- 设置一个根对象,如果设置了这个根对象,那么生成的keyClass或者recordClass会继承这个类;-->
        <!-- <property name="rootClass" value=""/> -->  
              
        <!-- 设置是否在getter方法中,对String类型字段调用trim()方法 -->
        <property name="trimStrings" value="true"/> 

  </javaModelGenerator>

  <!-- 生成的xml映射文件包名和项目路径,在Mybatis3之后,可以使用mapper.xml文件 + Mapper接口(或者不用mapper接口),
            或者只使用Mapper接口+Annotation,所以,如果 javaClientGenerator配置中配置了需要生成XML的话,这个元素就必须配置 -->

  <sqlMapGenerator targetPackage="mapper" targetProject="C:/Users/87620/Documents/workspace-sts-3.8.3.RELEASE/spirng-mybatis/src/main/resources" >
    <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
    <property name="enableSubPackages" value="true"/>
  </sqlMapGenerator>

  <!-- 生成DAO的包名和项目路径 -->
  <!-- 如果没有配置该元素,那么默认不会生成Mapper接口
        type:选择怎么生成mapper接口(在MyBatis3/MyBatis3Simple下):
            1,ANNOTATEDMAPPER:会生成使用Mapper接口+Annotation的方式创建(SQL生成在annotation中),不会生成对应的XML;
            2,MIXEDMAPPER:使用混合配置,会生成Mapper接口,并适当添加合适的Annotation,但是XML会生成在XML中;
            3,XMLMAPPER:会生成Mapper接口,接口完全依赖XML;
        如果context是MyBatis3Simple:只支持ANNOTATEDMAPPER和XMLMAPPER
    -->
  <javaClientGenerator targetPackage="com.example.demo.dao" targetProject="C:/Users/87620/Documents/workspace-sts-3.8.3.RELEASE/spirng-mybatis/src/main/java" type="XMLMAPPER" >
    <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
    <property name="enableSubPackages" value="true"/>        
  </javaClientGenerator>
  
  <!-- 要生成哪些表,更改tableName和domainObjectName
        tableName:要生成的表名
        domainObjectName:生成后的实例名
        enableCountByExample:Count语句中加入where条件查询,默认为true开启,MyBatis3Simple为false
        enableUpdateByExample:Update语句中加入where条件查询,默认为true开启,MyBatis3Simple为false
        enableDeleteByExample:Delete语句中加入where条件查询,默认为true开启,MyBatis3Simple为false
        enableSelectByExample:Select多条语句中加入where条件查询,默认为true开启
        selectByExampleQueryId:Select单个对象语句中加入where条件查询,默认为true开启
            选择一个或多个table来生成相关文件,会生成以下文件:
        1,SQL map文件
        2,生成一个主键类;
        3,除了BLOB和主键的其他字段的类;
        4,包含BLOB的类;
        5,一个用户生成动态查询的条件类(selectByExample, deleteByExample),可选;
        6,Mapper接口(可选)        
              设置delimitIdentifiers="true"即可保留数据库中大小写格式;
        
        其他属性,可选:
        alias:为数据表设置的别名,如果设置了alias,那么生成的所有的SELECT SQL语句中,列名会变成:alias_actualColumnName
        enableInsert(默认true):指定是否生成insert语句;
        enableSelectByPrimaryKey(默认true):指定是否生成按照主键查询对象的语句(就是getById或get);
        enableSelectByExample(默认true):MyBatis3Simple为false,指定是否生成动态查询语句;
        modelType:参考context元素的defaultModelType,相当于覆盖;
        delimitIdentifiers:参考tableName的解释,注意,默认的delimitIdentifiers是双引号,如果类似MYSQL这样的数据库,使用的是`(反引号,那么还需要设置context的beginningDelimiter和endingDelimiter属性)
        delimitAllColumns:设置是否所有生成的SQL中的列名都使用标识符引起来。默认为false,delimitIdentifiers参考context的属性
     -->
  <table tableName="test" domainObjectName="Test"  enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" >
       <!-- 参考 javaModelGenerator 的 constructorBased属性-->
        <property name="constructorBased" value="false"/>
        
        <!-- 默认为false,如果设置为true,在生成的SQL中,table名字不会加上catalog或schema;-->
        <property name="ignoreQualifiersAtRuntime" value="false"/>
        
        <!-- 参考 javaModelGenerator 的 immutable 属性 -->
        <property name="immutable" value="false"/>
        
        <!-- 指定是否只生成domain类,如果设置为true,只生成domain类,如果还配置了sqlMapGenerator,那么在mapper XML文件中,只生成resultMap元素 -->
        <property name="modelOnly" value="false"/>        
        
        <!-- 如果设置为true,生成的model类会直接使用column本身的名字,而不会再使用驼峰命名方法,比如BORN_DATE,生成的属性名字就是BORN_DATE,而不会是bornDate -->
        <property name="useActualColumnNames" value="false"/>  
                  
         <!-- ignoreColumn设置一个MGB忽略的列,如果设置了该列,那么在生成的domain中,生成的SQL中,都不会有该列出现 
         <ignoreColumn column="deptId" delimitedColumnName=""/> -->       
  </table>
  </context>
</generatorConfiguration>

第三步,创建main文件,很重要。

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 org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

/**
 * MyBatis generator通过main方法生成示例
 * @author 程就人生
 * @date 2019年9月6日
 */
public class TestGenerator {

  public  static void main(String[] agro){
    try{
      //可对配置文件里的参数做动态替换
          //Properties prop = new Properties();
          
      //收集错误信息
      List<String> warnings = new ArrayList<String>();
      //重写标识,此标识为true时,实体类、dao已存在会在后面追加;
      //设置为false时,实体类、dao不会被追加,会生成一个新的java类类名加数字,但xml文件依旧会被追加;
      boolean overwrite = false;
      //读取配置文件,三种写法
      //File configFile = new File(TableInfoController.class.getResource("generatorConfig.xml").getFile());  
      //ResourceUtils.getURL("classpath:generatorConfig.xml")
      Resource resource = new ClassPathResource("generatorConfig.xml"); 
      
      //动态参数的替换加载
      //ConfigurationParser cp = new ConfigurationParser(prop, warnings);
      ConfigurationParser cp = new ConfigurationParser(warnings);
      
      Configuration config = cp.parseConfiguration(resource.getFile());
      
      DefaultShellCallback callback = new DefaultShellCallback(overwrite);
      
      MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
      
      myBatisGenerator.generate(null);
      //输出错误信息,一定要输出,不然出错了,会找不到错误信息
      if(warnings.size() > 0){
        warnings.forEach(System.out::println);
      }
    }catch(Exception e){
      e.printStackTrace();
    }
  }
}

最后,就可以直接选中main文件运行了。运行后,查看运行的结果,哪些属性是自己需要的,哪些不是自己需要的,可以根据配置文件中的说明加以定制。

总结
在做这个demo时,遇到了以下问题:
生成不报错,也没有任何输出,解决办法就是在main文件里加上 warnings.forEach(System.out::println); 这一句。
连接错误,com.mysql.jdbc.Driver改为com.mysql.cj.jdbc.Driver。
时间错误,在数据库连接后面加上?serverTimezone=GMT%2B8。
找不到项目路径错误,把相对路径改为绝对路径即可。

参考资料:
https://www.cnblogs.com/swugogo/p/7995391.html
https://blog.csdn.net/u012060033/article/details/86626478

相关文章

网友评论

    本文标题:MyBatis使用main文件,简单粗暴的逆向生成,挺全的配置注

    本文链接:https://www.haomeiwen.com/subject/blfeyctx.html