绝对详细的MyBatis代码生成器讲解

news2025/1/17 15:23:50

0.简介

在springboot工程中如果使用mybatis作为持久层框架,那必须知道如何自动生成 java 实体类、dao 层接口(mapper 接口)及mapper.xml文件,这样可以减少不必要的开发。

生成代码的方式有很多种,比如说利用idea的插件、maven插件,使用代码执行方法去生成

下面分享一下利用代码去生成我们需要的实体类、dao、mapper.xml

1.快速开始

打开官网:http://mybatis.org/generator/quickstart.html,官网里面描述的已经很清楚了,下面我们重新解释一下它的配置,这是重点,整个代码的核心就是这个配置

<!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="simple" targetRuntime="MyBatis3">
    <jdbcConnection driverClass="org.hsqldb.jdbcDriver"
        connectionURL="jdbc:hsqldb:mem:aname" />

    <javaModelGenerator targetPackage="example.model" targetProject="src/main/java"/>

    <sqlMapGenerator targetPackage="example.mapper" targetProject="src/main/resources"/>

    <javaClientGenerator type="XMLMAPPER" targetPackage="example.mapper" targetProject="src/main/java"/>

    <table tableName="FooTable" />
  </context>
</generatorConfiguration>

这是官网给出的一段简单的配置,我们一般会在resources目录下新建一个mybatisGeneratorConfig.xml这样的配置文件。这个配置里面有几个重要的标签,下面我们就解读一下这份配置

2.根节点 generatorConfiguration

它主要是包含三个子元素

属性描述
properties引入配置资源,例如数据库配置信息
classPathEntry引入类路径,例如引入JDBC的驱动程序
context用于指定生成一组对象的环境

这些子元素的顺序最好按照表格的顺序来配置,properties放在最前面,context放在最后面

3.引入配置properties

这个元素不是必须的,它有两个属性

属性描述
resource相对资源
url全路径

一般情况下我们的mybatisGeneratorConfig.xml配置文件和application.properties项目配置文件都是在resources目录下,因此使用resource属性,可以以下方式:

<properties resource="application.properties"/>

如果使用url,则

<properties url="file:///F:\javaStudy\mybatis-generator\mybatisGenerator\src\main\resources\application.properties"/>

一般情况下我们都是使用resource这个属性,如果使用url,不同开发人员项目所在的目录一般都是不一样的,比如我的项目是放在本机上的F盘,而有些人是E盘

4.JDBC驱动classPathEntry

这个元素用于引入某些类的路径,例如JDBC驱动类

属性描述
location相对路径或绝对路径

配置如下

<classPathEntry location="E:/apache-maven-3.8.5/repository/mysql/mysql-connector-java/8.0.18/mysql-connector-java-8.0.18.jar"/>

classPathEntry只在下面这两种情况下才有效

  1. 当加载 JDBC 驱动内省数据库时
  2. 当加载根类中的 JavaModelGenerator 检查重写的方法时

5.context

元素用于指定生成一组对象的环境 ,有以下四个属性

属性描述
idcontext唯一标识,用于追踪错误信息
defaultModelType如果目标运行时为“MyBatis3Simple”、“MyBatis 3DynamicSql”或“MyBatist3Kotlin”,则忽略此属性,它有下面三个值conditional(默认),flat(推荐),hierarchical
targetRuntime此属性用于指定生成的代码的运行时环境,有四个可选值:MyBatis3DynamicSql 、 MyBatis3Kotlin 、 MyBatis3(默认) 、 MyBatis3Simple
introspectedColumnImpl该参数可以指定扩展org.mybatis.generator.api.IntrospectedColumn该类的实现类

它有以下几个子元素

  1. property
  2. plugin
  3. commentGenerator
  4. connectionFactory
  5. jdbcConnection
  6. javaTypeResolver
  7. javaModelGenerator
  8. sqlMapGenerator
  9. javaClientGenerator
  10. table

这些元素需要按照严格的顺序来,后面会对属性逐一讲解

context配置例子

<context id="mysql_tables" targetRuntime="MyBatis3" defaultModelType="flat">
    //子元素配置项
</context>  

使用MyBatis3 生成的mapper内容

long countByExample(StudentExample example);

int insert(Student row);

int insertSelective(Student row);

List<Student> selectByExample(StudentExample example);

Student selectByPrimaryKey(Long id);

int updateByExampleSelective(@Param("row") Student row, @Param("example") StudentExample example);

int updateByExample(@Param("row") Student row, @Param("example") StudentExample example);

int updateByPrimaryKeySelective(Student row);

int updateByPrimaryKey(Student row);

而使用MyBatis3Simple生成的mapper如下

int insert(Student row);

Student selectByPrimaryKey(Long id);

List<Student> selectAll();

int updateByPrimaryKey(Student row);

很显然MyBatis3要比MyBatis3Simple生成的方法要多,正常情况下我们使用MyBatis3会比较多

5.1property

它有以下几个属性

属性描述
autoDelimitKeywords如果为true,则如果SQL关键字用作表中的列名,则MBG将对其进行分隔,默认值是false
beginningDelimiter要用作需要分隔符的SQL标识符的起始标识符分隔符的值,默认值为双引号(“)
endingDelimiter要用作需要分隔符的SQL标识符的结束标识符分隔符的值,默认值为双引号(“)
javaFileEncodingjava文件的编码
javaFormatter使用此属性可以为生成的Java文件指定用户提供的格式化程序的完整类名
kotlinFileEncodingKotlin文件的编码
kotlinFormatter使用此属性可以为生成的Kotlin文件指定用户提供的格式化程序的完整类名
xmlFormatter使用此属性可以为生成的XML文件指定用户提供的格式化程序的完整类名

配置例子:

<context id="mysql_tables" targetRuntime="MyBatis3" defaultModelType="flat">
    <property name="beginningDelimiter" value=""/>
    <property name="endingDelimiter" value=""/>
    <property name="javaFileEncode" value="UTF-8"/>
</context>  

5.2plugin

元素用于定义插件,它有一个属性

属性描述
type完整的类名

配置例子

<!-- 生成序列化方法 -->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
<!-- 生成序列化toString -->
<plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin">
    <property name="useEqualsHashCodeFromRoot" value="true"/>
</plugin>
<!-- 生成序列化equals和hashcode -->
<plugin type="org.mybatis.generator.plugins.ToStringPlugin">
    <property name="useToStringFromRoot" value="true"/>
</plugin>
<!-- 直接覆盖生成的mapper.xml -->
<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" />

生成的实体类会包含下面的几个方法

@Override
public boolean equals(Object that) {
    // 代码省略
}

@Override
public int hashCode() {
   // 代码省略
}

@Override
public String toString() {
    // 代码省略
}

5.3注释commentGenerator

该元素主要用于配置注释,它有一个属性

属性描述
type完整的类名

它有一个子元素property,主要包含以下几个属性

属性描述
suppressAllComments不让生成注释,默认值是false,表示生成注释,如果为true,表示不让生成注释
suppressDate不让生成的注释包含时间戳,默认值是false
addRemarkComments添加 db 表中字段的注释
dateFormat将日期写入生成的注释时使用的日期格式字符串
useLegacyGeneratedAnnotation指定是否使用不推荐使用的“javax”命名空间中的注释

比较常用的是suppressAllCommentssuppressDateaddRemarkComments

配置例子

 <!-- 注释 -->
<commentGenerator type="com.example.mybatisgenerator.CommentGenerator">
    <!-- 添加 db 表中字段的注释 -->
    <property name="addRemarkComments" value="true"/>
    <!-- 不让生成注释 -->
    <property name="suppressAllComments" value="true"/>
    <!-- 不希望生成的注释中包含时间戳 -->
    <property name="suppressDate" value="true"/>
</commentGenerator>

不知道大家有没有注意到com.example.mybatisgenerator.CommentGenerator是我自定义的注释实现类,这里为什么要自定义呢?

	/**
     * Database Column Remarks:
     *   自增ID
     *
     * This field was generated by MyBatis Generator.
     * This field corresponds to the database column student.id
     *
     * @mbg.generated
     */
    private Long id;

    /**
     * Database Column Remarks:
     *   名称
     *
     * This field was generated by MyBatis Generator.
     * This field corresponds to the database column student.name
     *
     * @mbg.generated
     */
    private String name;

这是mybatis自带的注释格式,为了简洁一些,一般都会自定义一个注释的实现类

package com.example.mybatisgenerator;

import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.internal.DefaultCommentGenerator;
import org.mybatis.generator.internal.util.StringUtility;
import java.util.Properties;

public class CommentGenerator extends DefaultCommentGenerator {
    private boolean addRemarkComments = false;

    @Override
    public void addConfigurationProperties(Properties props){
        super.addConfigurationProperties(props);
        this.addRemarkComments = StringUtility.isTrue(props.getProperty("addRemarkComments"));
    }

    @Override
    public void addFieldComment(Field field, IntrospectedTable introspectedTable,
                                IntrospectedColumn introspectedColumn) {
        String remarks = introspectedColumn.getRemarks();
        if (addRemarkComments && StringUtility.stringHasValue(remarks)){
            field.addJavaDocLine("/**");
            String[] remarkLines = remarks.split(System.getProperty("line.separator"));
            for (String remarkLine : remarkLines) {
                field.addJavaDocLine(" * " + remarkLine);
            }
            field.addJavaDocLine(" */");
        }
    }
}

最后生成这样的注释

	/**
     * 自增ID
     */
    private Long id;

    /**
     * 名称
     */
    private String name;

    /**
     * 年龄
     */
    private Integer age;

5.4数据库jdbcConnection

元素用于指定内省表所需的数据库连接的属性

属性描述
driverClass用于访问数据库的JDBC驱动程序的完全限定类名
connectionURL用于访问数据库的JDBC连接URL
userId数据库账号
password数据库密码

配置例子:

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

前面介绍了properties元素,主要是引入一些外部配置,我们可以通过${}的方式去访问变量

5.5解析类型javaTypeResolver

元素用于定义Java类型解析程序的属性,它有一个属性

属性描述
typeJava类型解析程序

它有一个子元素property,主要包含以下几个属性

属性描述
forceBigDecimals强制转换DECIMAL和NUMERIC字段为java.math.BigDecimal
useJSR310Types强制使用DATE、TIME和TIMESTAMP字段的JSR-310数据类型,而不是使用java.util.DATE

配置例子

 <!-- 类型解析器 -->
<javaTypeResolver>
    <property name="forceBigDecimals" value="true"/>
</javaTypeResolver>

5.6实体类javaModelGenerator

这个是生成实体类配置标签,它有两个必选属性

属性描述
targetPackage生成实体类存放的包路径
targetProject指定目标项目路径,可以是绝对路径或相对路径

它还包含了下面几个 property 子元素属性

属性描述
constructorBased:该属性只对MyBatis3有效,如果true就会使用构造方法入参,如果false就会使用setter方式。默认为false
enableSubPackages如果true,MBG会根据catalogschema来生成子包,默认是false
immutable用来配置实体类属性是否可变,默认是false
rootClass设置所有实体类的基类
trimStrings是否去掉返回数据的空白符

加粗的属性enableSubPackagestrimStrings是比较常用的配置

配置示例如下:

 <!-- 实体类 -->
<javaModelGenerator  targetPackage="com.example.mybatisgenerator.entity"
                    targetProject="src\main\java">
    <property name="enableSubPackages" value="true" />
    <property name="trimStrings" value="true"/>
</javaModelGenerator>

在这里插入图片描述

5.7SQL映射sqlMapGenerator

元素用于定义SQL映射生成器的属性,它有两个必选属性

属性描述
targetPackagexml存放的包路径
targetProject指定目标项目路径,可以是绝对路径或相对路径

property 子元素属性

属性描述
enableSubPackages如果true,MBG会根据catalogschema来生成子包,默认是false

配置例子

<!-- xml -->
<sqlMapGenerator
                 targetPackage="mapper"
                 targetProject="src\main\resources">
    <property name="enableSubPackages" value="true" />
</sqlMapGenerator>

在这里插入图片描述

5.8持久层javaClientGenerator

元素用于定义Java客户端生成器的属性,其实就说持久层(DAO)接口,它包含三个属性

属性描述
type此属性用于选择预定义的Java客户端生成器之一,或指定用户提供的Java客户端生成程序
targetPackage生成实体类存放的包路径
targetProject指定目标项目路径,可以是绝对路径或相对路径

property 子元素属性

属性描述
enableSubPackages如果true,MBG会根据catalogschema来生成子包,默认是false
dynamicSqlSupportPackage此属性仅适用于目标运行时MyBatis3DynamicSql或MyBatis3Kotlin

配置例子

<!-- Mapper接口 -->
<javaClientGenerator type="XMLMAPPER"
                     targetPackage="com.example.mybatisgenerator.mapper"
                     targetProject="src\main\java">
    <property name="enableSubPackages" value="true" />
</javaClientGenerator>

在这里插入图片描述

5.9数据表table

元素用于为每个表生成实体类、sql映射文件(xml),持久层接口(DAO),这是非常重要的配置

属性描述
tableName必填属性,数据库表,如果需要,指定的值可以包含SQL通配符
schema数据库模式-如果数据库不使用模式,或者有默认模式,则不需要数据库模式。如果需要,指定的值可以包含SQL通配符。
catalog数据库目录-如果数据库不使用目录,或者有默认目录,则不需要该目录
alias别名,例如 select * from news as n,会为表加上别名。 注意目标运行时为“MyBatis3DynamicSql”或“MyBatis 3Kotlin”,则忽略此属性
domainObjectName实体类名称。比如表名是news,会生成News、NewsMapper等文件,如果设置该属性为NewsPO,那么会生成NewsPO、NewsPOMapper
mapperNameMapper的名称 注意目标运行时为“MyBatis3DynamicSql”或“MyBatis 3Kotlin”,则忽略此属性
sqlProviderNamesql映射文件(xml)的名称 注意目标运行时为“MyBatis3DynamicSql”或“MyBatis 3Kotlin”,则忽略此属性
enableInsert插入方法,默认值为true 注意目标运行时为“MyBatis3DynamicSql”或“MyBatis 3Kotlin”,则忽略此属性
enableSelectByPrimaryKey根据主键查询方法 ,默认值为true 注意目标运行时为“MyBatis3DynamicSql”或“MyBatis 3Kotlin”,则忽略此属性
enableSelectByExample根据条件查询方法 ,默认值为true 注意目标运行时为“MyBatis3DynamicSql”或“MyBatis 3Kotlin”,则忽略此属性
enableUpdateByPrimaryKey根据主键更新方法,默认值为true 注意目标运行时为“MyBatis3DynamicSql”或“MyBatis 3Kotlin”,则忽略此属性
enableDeleteByPrimaryKey根据主键删除方法,一般情况下都是软删除,因此一般不生成该方法 注意目标运行时为“MyBatis3DynamicSql”或“MyBatis 3Kotlin”,则忽略此属性
enableDeleteByExample根据条件删除方法,默认值为true 注意目标运行时为“MyBatis3DynamicSql”或“MyBatis 3Kotlin”,则忽略此属性
enableCountByExample根据条件查询总数方法,默认值为true 注意目标运行时为“MyBatis3DynamicSql”或“MyBatis 3Kotlin”,则忽略此属性
enableUpdateByExample根据条件更新方法,默认值为true 注意目标运行时为“MyBatis3DynamicSql”或“MyBatis 3Kotlin”,则忽略此属性
selectByPrimaryKeyQueryId此值将以以下形式添加到select by主键语句的select列表中:“''as QUERYID”。这对于在运行时识别DBA跟踪工具中的查询非常有用。如果您使用这样的值,您应该为MBG生成的每个不同的查询指定一个唯一的id。 注意目标运行时为“MyBatis3DynamicSql”或“MyBatis 3Kotlin”,则忽略此属性
selectByExampleQueryId此值将以以下形式添加到select by example语句的select列表中:“''as QUERYID”。这对于在运行时识别DBA跟踪工具中的查询非常有用。如果您使用这样的值,您应该为MBG生成的每个不同的查询指定一个唯一的id 注意目标运行时为“MyBatis3DynamicSql”或“MyBatis 3Kotlin”,则忽略此属性
modelType如果希望为此表覆盖默认模型类型,则使用此属性
escapeWildcards指示在搜索列时是否应转义架构和tableName中的SQL通配符(“_”和“%”)。如果架构或表名包含SQL通配符,则某些驱动程序需要这样做(例如,如果表名为MY_table,则某些驱动器要求转义下划线).默认值为false。
delimitIdentifiers指示MBG在搜索表时是否应使用指定的大小写,然后在生成的SQL中对标识符进行定界。默认值为false
delimitAllColumns指示MBG是否应向生成的SQL中的所有列名添加分隔符。默认值为false

它有下面几个属性

  1. property
  2. generatedKey
  3. domainObjectRenamingRule
  4. columnRenamingRule
  5. columnOverride
  6. ignoreColumn

下面对generatedKey和columnOverride进行讲解

generatedKey

主键生成属性,默认情况下都是都是这样配置

<generatedKey column="id" sqlStatement="Mysql" identity="false" />

columnOverride

重新某些字段的值,这个比较有用,比如说数据表的TINYINT型字段默认对应的javaType是Byte,有时候我们需要转成Integer

<columnOverride column="deleted" javaType="Integer" jdbcType="TINYINT"/>

下面是一个table的配置示例

<!-- 指定数据库表 -->
        <table tableName="student"
               enableCountByExample="true"
               enableUpdateByExample="true"
               enableDeleteByExample="false"
               enableSelectByExample="true"
               selectByExampleQueryId="true"
               enableSelectByPrimaryKey="true"
               enableUpdateByPrimaryKey="true"
               enableDeleteByPrimaryKey="false"
        >
            <generatedKey column="id" sqlStatement="Mysql" identity="false" />
            <columnOverride column="deleted" javaType="Integer" jdbcType="TINYINT"/>
            <columnOverride column="create_time" javaType="java.time.LocalDateTime" jdbcType="TIMESTAMP"/>
            <columnOverride column="update_time" javaType="java.time.LocalDateTime" jdbcType="TIMESTAMP"/>
        </table>

6.实践

1.引入依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--数据库驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.28</version>
    </dependency>
    <!--数据库连接池-->
    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
    </dependency>
    <!--mybatis-->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.0</version>
    </dependency>
    <!--mybatis generator生成器-->
    <dependency>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-core</artifactId>
        <version>1.4.1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

2.配置

spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/demo?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

3.mybatis生成器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"/>

    <classPathEntry location="E:/apache-maven-3.8.5/repository/mysql/mysql-connector-java/8.0.18/mysql-connector-java-8.0.18.jar"/>

    <!-- context 一般是一个数据源一个context -->
    <context id="mysql_tables" targetRuntime="MyBatis3" defaultModelType="flat">
        <property name="beginningDelimiter" value=""/>
        <property name="endingDelimiter" value=""/>
        <property name="javaFileEncode" value="UTF-8"/>

        <!-- 生成序列化方法 -->
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
        <!-- 生成序列化toString -->
        <plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin">
            <property name="useEqualsHashCodeFromRoot" value="true"/>
        </plugin>
        <!-- 生成序列化equals和hashcode -->
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin">
            <property name="useToStringFromRoot" value="true"/>
        </plugin>
        <!-- 直接覆盖生成的mapper.xml -->
        <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" />

        <!-- 注释 -->
        <commentGenerator type="com.example.mybatisgenerator.CommentGenerator">
            <!-- 添加 db 表中字段的注释 -->
            <property name="addRemarkComments" value="true"/>
            <!-- 是否不生成注释 -->
            <property name="suppressAllComments" value="true"/>
            <!-- 不希望生成的注释中包含时间戳 -->
            <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}">
        </jdbcConnection>

        <!-- 类型解析器 -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="true"/>
        </javaTypeResolver>

        <!-- 实体类 -->
        <javaModelGenerator  targetPackage="com.example.mybatisgenerator.entity"
                             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.example.mybatisgenerator.mapper"
                             targetProject="src\main\java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>

        <!-- 指定数据库表 -->
        <table tableName="student"
               enableCountByExample="true"
               enableUpdateByExample="true"
               enableDeleteByExample="false"
               enableSelectByExample="true"
               selectByExampleQueryId="true"
               enableSelectByPrimaryKey="true"
               enableUpdateByPrimaryKey="true"
               enableDeleteByPrimaryKey="false"
        >
            <generatedKey column="id" sqlStatement="Mysql" identity="false" />
            <columnOverride column="deleted" javaType="Integer" jdbcType="TINYINT"/>
            <columnOverride column="create_time" javaType="java.time.LocalDateTime" jdbcType="TIMESTAMP"/>
            <columnOverride column="update_time" javaType="java.time.LocalDateTime" jdbcType="TIMESTAMP"/>
        </table>

    </context>
</generatorConfiguration>

com.example.mybatisgenerator.CommentGenerator自定义注释的实现类代码上面有

4.启动

在测试类里面写一个方法

@Test
void generate() throws XMLParserException, IOException, InvalidConfigurationException, SQLException, InterruptedException {
    List<String> warnings = new ArrayList<>();
    InputStream in = MyBatisGenerator.class.getClassLoader().getResourceAsStream("mybatisGeneratorConfig.xml");
    ConfigurationParser cp = new ConfigurationParser(warnings);
    Configuration config = cp.parseConfiguration(in);
    assert in != null;
    in.close();

    // 覆盖 Java 文件
    boolean overwrite = true;
    DefaultShellCallback callback = new DefaultShellCallback(overwrite);
    MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);

    // 生成文件
    myBatisGenerator.generate(null);
    // 打印信息
    warnings.forEach(System.err::println);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1107649.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

rust学习—— 控制流if 表达式

控制流 根据条件是否为真来决定是否执行某些代码&#xff0c;或根据条件是否为真来重复运行一段代码&#xff0c;是大部分编程语言的基本组成部分。Rust 代码中最常见的用来控制执行流的结构是 if 表达式和循环。 if 表达式 if 表达式允许根据条件执行不同的代码分支。你提供…

C++学习:数据的存储、作用域、链接

一、数据的存储方式 C中使用3种不同的方案来存储数据&#xff0c;不同方案的区别在于数据在内存中保留的时间。 1、自动存储 在函数定义中声明的变量&#xff0c;以及函数的参数&#xff0c;是自动存储的。在程序执行对应函数的时候创建这些变量&#xff0c;对应的函数执行完…

别再卷组件库了,Vue 拖拽库都断代了!

前言 最近在测试 Tailwind CSS 和 Uno CSS 这两种原子化 CSS 工具是否能够有效减少打包后的文件体积时&#xff0c;先开始分析这些工具的优缺点&#xff0c;然后再直接上数据&#xff0c;最后做了一款经典的 TodoList 来进行测试&#xff0c;文章都写好了就差最后的数据了。 …

中国人民大学与加拿大女王大学金融硕士项目:开启你的金融精英之路

在全球化的今天&#xff0c;金融行业的发展日新月异&#xff0c;对金融人才的需求也日益增长。为了满足这一需求&#xff0c;中国人民大学与加拿大女王大学联合推出了金融硕士项目&#xff0c;旨在培养具有国际视野、专业素养和创新能力的金融精英。 这一开创性的项目将两大世…

VR全景图片如何拍摄制作,拍摄制作过程中要注意什么?

引言&#xff1a; VR全景图片就是通过专业的相机设备捕捉到的一个空间的高清图像&#xff0c;再经过专业工具进行拼合&#xff0c;呈现出一种环绕式的视觉效果。想象一下&#xff0c;当你站在一个完全真实的环境中&#xff0c;可以自由地转动视角&#xff0c;看到四周的景色&a…

2023.10(u盘刻录iso)主机,vmware,virtualbox安装linux/ubuntu/kali/centos stream9/arch

download 1 kali官网 2 ubuntu官网 3vmware workstation pro(最新版17pro) 4 virtualbox for linux sudo apt install virtualbox-ext-pack 5 win32 disk imger linux dd 刻录iso到u盘 #查看U盘路径 fdisk -l #图形界面 以kali为例会在桌面出现挂载图标 点开之后输入pwd寻…

基于svg+js实现简单动态时钟

实现思路 创建SVG容器&#xff1a;首先&#xff0c;创建一个SVG容器元素&#xff0c;用于容纳时钟的各个部分。指定SVG的宽度、高度以及命名空间。 <svg width"200" height"200" xmlns"http://www.w3.org/2000/svg"><!-- 在此添加时钟…

森海塞尔EW-DP SKP直插式发射机:真正的无失真录制

韦德马克&#xff0c;2023年9月15日 – 10月底&#xff0c;EW-DP系列将再添新品——EW-DP SKP直插式发射机&#xff0c;面向摄像师、广播电视公司和电影制作人。板载32位浮点录制&#xff0c;结合该系列领先的134 dB发射机动态范围&#xff0c;让音频失真不复存在。无论要在现场…

将 windows 控制台编码修改成UTF-8

将 windows 控制台编码修改成UTF-8 临时修改&#xff0c;在控制台输入以下命令&#xff0c;65001代表utf-8编码 chcp 65001重新打开控制台后&#xff0c;又会变成默认GBK编码 永久修改&#xff0c;设置>时间和语言>语言>管理语言设置 打开更改系统区域设置&#xf…

【Spring Boot项目】根据用户的角色控制数据库访问权限

文章目录 简介方法一添加数据库依赖配置数据库连接创建用户角色表创建Spring Data JPA实体和仓库实现自定义的网关过滤器配置网关过滤器几个简单的测试API 方法二创建数据库访问接口实现数据库访问接口创建用户角色判断逻辑创建网关过滤器配置网关过滤器 总结 简介 在一些特定…

0基础学习PyFlink——Map和Reduce函数处理单词统计

在很多讲解大数据的案例中&#xff0c;往往都会以一个单词统计例子来抛砖引玉。本文也不免俗&#xff0c;例子来源于PyFlink的《Table API Tutorial》&#xff0c;我们会通过几种方式统计不同的单词出现的个数&#xff0c;从而达到循序渐进的学习效果。 常规方法 # input.py …

《Python入门核心技术》专栏总目录

❤️ 专栏名称&#xff1a;《Python入门核心技术》 &#x1f338; 内容介绍&#xff1a;基础篇、进阶篇、Web篇、网络爬虫、数据分析、数据可视化、自动化等&#xff0c;适合零基础和进阶的同学。 &#x1f680; 订阅专栏&#xff1a;订阅后可阅读专栏内所有内容&#xff0c;专…

易点易动设备管理系统:提升生产企业设备保养效率的利器

在现代生产企业中&#xff0c;设备保养是确保生产线稳定运行和产品质量的关键环节。然而&#xff0c;传统的设备保养方式往往面临效率低下、数据不准确等问题&#xff0c;影响了生产效率和竞争力。随着科技的进步&#xff0c;易点易动设备管理系统应运而生&#xff0c;以其智能…

【Netty专题】【网络编程】从OSI、TCP/IP网络模型开始到BIO、NIO(Netty前置知识)

目录 前言前置知识一、计算机网络体系结构二、TCP/IP协议族2.1 简介*2.2 TCP/IP网络传输中的数据2.3 地址和端口号2.4 小总结 三、TCP/UDP特性3.1 TCP特性TCP 3次握手TCP 4次挥手TCP头部结构体 3.2 UDP特性 四、总结 课程内容一、网络通信编程基础知识1.1 什么是Socket1.2 长连…

kkFileView源码编译并发布详细教程

文章目录 概述为啥要自己进行源码编译我不懂Java代码&#xff0c;可以编译吗为什么写这篇教程 废话不多说&#xff0c;下面是详细操作教程安装JDK安装Git安装Maven编译kkFileView源码 kkFileView安装和使用编译后获得安装包&#xff0c;进行解压修改配置文件执行在线安装&#…

开源贡献难吗?

本文整理自字节跳动 Flink SQL 技术负责人李本超在 CommunityOverCode Asia 2023 上的 Keynote 演讲&#xff0c;李本超根据自己在开源社区的贡献经历&#xff0c;基于他在贡献开源社区过程中的一些小故事和思考&#xff0c;如何克服困难&#xff0c;在开源社区取得突破&#x…

DNS压测工具-dnsperf的安装和使用(centos)

系统调优 系统调优脚本&#xff0c;保存为sh文件&#xff0c;chmod提权后执行即可 #!/bin/sh #系统全局允许分配的最大文件句柄数&#xff1a; sysctl -w fs.file-max2097152 sysctl -w fs.nr_open2097152 echo 2097152 > /proc/sys/fs/nr_open #允许当前会话 / 进程打开文…

1.JDK的安装方法以及环境变量的配置

学习Java的第一步应该从配置环境开始&#xff0c;这篇博文介绍了在哪下载安装包以及如何在windows电脑中配置&#xff0c;希望大家看完后可以独立安装 ~ 文章目录 一、下载安装包二、 安装路径配置三、 环境变量配置四、 验证是否配置成功 一、下载安装包 安装包可以从官网下载…

第三方软件测评单位可为企业带来哪些收益?

随着信息科技的发展&#xff0c;软件市场竞争也越来越大&#xff0c;软件企业为了更好的专注于产品开发&#xff0c;以及保障软件质量&#xff0c;会将软件测试交由第三方软件测评单位进行。 第三方软件测评&#xff0c;顾名思义&#xff0c;是由独立的、与软件开发商无关的专业…

Unity中Shader的XRay透视效果

文章目录 前言一、模拟菲涅尔效果1、获取 V 向量2、获取 N 向量3、点积输出效果4、模拟出菲涅尔效果(中间暗&#xff0c;周围亮) 二、实现 &#xff38;Ray 效果1、使用半透明排序、修改混合模式、加点颜色2、增加分层效果&#xff08;使用 frac 函数&#xff0c;只取小数部分&…