mybatis学习(3) - MyBatis Generate配置详解

本文详细解析MyBatis Generator配置文件的各项参数含义及其作用,帮助读者掌握自动化代码生成的细节,提升开发效率。

上一篇《mybatis学习(2) - MyBatis Generate的使用》介绍了MBG的入门及简单使用,本篇中再详细的学习一下生成配置文件,官方配置文件标签说明地址:http://mybatis.org/generator/configreference/xmlconfig.html,我们直接使用多层注释来理解他的配置文件,个人感觉这种效果最好。

<?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>
  <!-- 使用的数据库驱动地址(可以为zip、jar等),数量:0~N -->
  <classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />

  <!-- 一组对象环境,一般对应一个数据库,如果多个数据库组,可以使用不同的id来区分 数量:1~N -->
  <context id="DB2Tables" targetRuntime="MyBatis3">
    <!-- 数据库连接信息,需要注意JDBC的驱动是否在classpath下,如果不在,可使用classPathEntry引入 -->
    <!-- userId & password为密码 & 账号 -->
    <jdbcConnection 
        driverClass="COM.ibm.db2.jdbc.app.DB2Driver"
        connectionURL="jdbc:db2:TEST"
        userId="db2admin"
        password="db2admin">
    </jdbcConnection>

    <!-- java类型转换配置,数量:0~1 -->
    <javaTypeResolver >
        <!--
            数字转换规则:
            如果精度>0或者长度>18,就会使用java.math.BigDecimal
            如果精度=0并且10<=长度<=18,就会使用java.lang.Long
            如果精度=0并且5<=长度<=9,就会使用java.lang.Integer
            如果精度=0并且长度<5,就会使用java.lang.Short
        -->
      <property name="forceBigDecimals" value="false" />
    </javaTypeResolver>

    <!-- java模型生成器,targetPackage,表示此模型类所属包,targetProject,源代码生成路径。数量:1 -->
    <javaModelGenerator targetPackage="test.model" targetProject="\MBGTestProject\src">
      <!-- 生成的类是否只包含getter,不包含setter,只对MyBatis3有效,默认为false -->
      <property name="constructorBased" value="true" />
      <!-- 是否使用子包,意思允许,那么生成的类放在以schema为子包名的文件夹中,默认为false -->
      <property name="enableSubPackages" value="true" />
      <!-- 实体类属性是否可变,如果设置了,会忽略constructorBased,并不生成setter函数,并直接影响构造函数,默认false -->
      <property name="immutable" value="true" />
      <!-- 所有类的基类,需要使用全名称 -->
      <property name="rootClass" value="example.com.baseModel" />
      <!-- 是否对数据库结果进行trim操作 -->
      <property name="trimStrings" value="true" />
      <!-- 对实例对象使用不同的包名,不设置与实力一样 -->
      <property name="exampleTargetPackage" value="" />
      <!-- 对实例对象使用不同的目标项目,与上面描述类似 -->
      <property name="exampleTargetProject" value="" />
    </javaModelGenerator>

    <!-- 映射文件生成配置,假设没有指定,则不会生成xml文件。targetPackage,表示此模型类所属包,targetProject,源代码生成路径。数量:0~1 -->
    <sqlMapGenerator targetPackage="test.xml"  targetProject="\MBGTestProject\src" >
      <!-- 与上方类似 -->
      <property name="enableSubPackages" value="true" />
    </sqlMapGenerator>

    <!-- 字面意思也能理解,java客户端创建,意思就是调取接口的生成配置了,数量:0~1 -->
    <!-- 
        type 的类型
        ANNOTATEDMAPPER: 基于注解的Mapper接口,无对应xml映射文件
        MIXEDMAPPER: 混合形式
        XMLMAPPER: 所有方法都在xml中
    -->
    <javaClientGenerator type="XMLMAPPER" targetPackage="test.dao"  targetProject="\MBGTestProject\src">
      <!-- 与上方类似 -->
      <property name="enableSubPackages" value="true" />
      <!-- 所有接口继承的父接口,可以通过table配置的属性覆盖 -->
      <property name="rootInterface" value="" />
    </javaClientGenerator>

    <!-- 配置需要获取的表,只有配置才能生成对应文件,数量:1~N -->
    <!-- 
        tableName 指定生成的表名,可以通过通配符获取多个
        schema 数据库的schema,生成的sql语句表为 schema.tableName
        catalog 数据库的catelog,生成的sql表名会变成 schema.tableName
        alias 别名
        domainObjectName 生成实体对象的基本名称
        enable? 表示是否允许某个设置
        selectByPrimaryKeyQueryId
        selectByExampleQueryId
        modelType 针对表配置,会覆盖context中的defaultModelType
        escapeWildcards 
        delimitIdentifiers 是否给标识符添加分隔符,默认flase
        delimitAllColumns 是否对所有列添加分隔符,默认false
     -->
    <table schema="DB2ADMIN" tableName="ALLTYPES" domainObjectName="Customer" >
      <!-- 与上相似 -->
      <property name="constructorBased" value="false" />
      <!-- 动态sql支持类名 -->
      <property name="dynamicSqlSupportClassName" value="" />
      <!-- 动态表名生成的类使用的名称 -->
      <property name="dynamicSqlTableObjectName" value="" />
      <!-- 是否将模式或目录在运行时添加到生成的SQL表名中,默认false -->
      <property name="ignoreQualifiersAtRuntime" value="true" />
      <!-- 同上 -->
      <property name="immutable" value="true" />
      <!-- 是否只为表生成模型类 -->
      <property name="modelOnly" value="true" />
      <!-- 同上 -->
      <property name="rootClass" value="" />
      <!-- 同上 -->
      <property name="rootInterface" value="" />
      <!-- 运行时目录,覆盖之前设置的catalog -->
      <property name="runtimeCatalog" value="" />
      <!-- 同上,覆盖之前的schema -->
      <property name="runtimeSchema" value="" />
      <!-- 使用它,就覆盖了之前的tableName -->
      <property name="runtimeTableName" value="" />
      <!-- 此属性可用于指定将添加到selectAll方法中的order by子句,仅包含列列表字段 -->
      <property name="selectAllOrderByClause" value="" />
      <!-- 默认值从javaModelGenerator继承,否则为false -->
      <property name="trimStrings" value="true" />
      <!-- true表示实体对象的属性为元数据获取的列名,反之尝试将名称转换为驼峰形式,默认为false -->
      <property name="useActualColumnNames" value="false" />
      <!-- 是否使用列索引 -->
      <property name="useColumnIndexes" value="true"/>
      <!-- 生成属性是否会将列名和备注链接起来 -->
      <property name="useCompoundPropertyNames" value="" />
      <!-- 配置自动生成主键的属性 数量:0~1 -->
      <!--
        column: 列名
        sqlStatement:将返回新值的SQL语句,如果这个是identity列,可以使用预设值:
        Cloudscape、DB2、DB2_MF、Derby、HSQLDB、MySql、SqlServer、SYBASE、JDBC
      -->
      <generatedKey column="ID" sqlStatement="DB2" identity="true" />
      <!-- 生成列之前,对列名称进行重命名,通过搜索searchString,然后替换为replaceString来重新命名 -->
      <columnRenamingRule searchString="" replaceString="" />
      <!-- 优先于columnRenamingRule规则 数量:0~N -->
      <!--
        column:要重写的列名
        property:要使用的java属性名称
        javaType:使用的java类型
        jdbcType:该列的jdbc类型,如果需要可以覆盖此类型
        typeHandler:用户需要的用来处理这列的类型处理器
        delimitedColumnName: 指定是否在生成的SQL列名称上增加分隔符
      -->
      <columnOverride column="DATE_FIELD" property="startDate" />
      <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />
      <!-- 可忽略的值,数量:0~N -->
      <!--
        column:忽略的列名
        delimitedColumnName:匹配列名是否区分大小写
      -->
      <ignoreColumn column="FRED" />
    </table>
  </context>
</generatorConfiguration>

以上配置文件基本上囊括了所有生成配置,但实际生产中我们应该只会用到常见的一些配置属性,其它的一般使用默认的配置即可。

下一篇,我们来学习下如何将mybatis及mbg整合进spring项目中。

mybatis也能方向生成代码,能方向生成实体类(po)、mapper接口和Mapper接口映射文件,能减少我们代码的工作量。详细步骤如下 1、下载mybatis生成架包工具MyBatis_Generator_1.3.1.zip,解压架包把features、plugins文件夹下的架包分别拷贝到eclipse安装目录下的features、plugins文件夹。重启eclipse就行。 解压后图片如下: Eclipse路径如图: 拷贝替换如图: 2、创建generatorConfig.xml文件,安装好mybatis 就能创建generatorConfig.xml 3配置generatorConfig.xml配置文件,详细如下 [html] view plain copy <?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> <!-- <classPathEntry location="D:\\rep\\mysql\\mysql-connector-java\\5.1.19\\mysql-connector-java-5.1.19.jar" /> --> <classPathEntry location="D:\\repo\\com\\oracle\\ojdbc14\\10.2.0.1.0\\ojdbc14-10.2.0.1.0.jar" /> <context id="DB2Tables" targetRuntime="MyBatis3"> <commentGenerator> <property name="suppressAllComments" value="true" /> <property name="suppressDate" value="true" /> </commentGenerator> <jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver" connectionURL="jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:orcl4" userId="xxx" password="xxxx" /> <javaTypeResolver> <property name="forceBigDecimals" value="false" /> <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer true,把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal --> </javaTypeResolver> <javaModelGenerator targetPackage="com.pcmall.domain.sale.order" targetProject="pos-service/src/main/java"> <property name="enableSubPackages" value="true" /> <property name="trimStrings" value="true" /> </javaModelGenerator> <sqlMapGenerator targetPackage="mybatis.mapper.sale.order" targetProject="pos-service/src/main/resources"> <property name="enableSubPackages" value="false" /> </sqlMapGenerator> <javaClientGenerator targetPackage="com.pcmall.dao.sale.order" targetProject="pos-service/src/main/java" type="XMLMAPPER"> <property name="enableSubPackages" value="false" /> </javaClientGenerator> <table tableName="hs_zxzflx" enableSelectByExample="false" enableDeleteByExample="false" enableCountByExample="false" selectByExampleQueryId="true" enableUpdateByExample="false"> <!-- <generatedKey column="ID" sqlStatement="oracle" identity="true" /> --> </table> </context> </generatorConfiguration> 4、右击generatorConfig.xml 点击Generate MyBatis/iBATIS Artifacts 生成对应接口、接口映射文件、实体类 5、查看结果
要使用 `mybatis-plus-generator 2.3` 自动生成代码,可以通过配置 `AutoGenerator` 类并结合自定义模板与规则来实现。以下是详细的操作步骤和配置说明: ### ### 添加依赖 在 `pom.xml` 文件中添加 `mybatis-plus-generator` 的依赖,同时确保引入了 `velocity` 模板引擎,因为 `mybatis-plus-generator` 默认使用 `velocity` 进行代码生成: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity</artifactId> <version>1.7</version> </dependency> ``` ### ### 编写代码生成器类 创建一个 Java 类用于配置并运行 `AutoGenerator`,例如 `CodeGenerator`。以下是一个基础的配置示例: ```java 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.DbType; import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; public class CodeGenerator { public static void main(String[] args) { // 代码生成器 AutoGenerator autoGenerator = new AutoGenerator(); // 全局配置 GlobalConfig globalConfig = new GlobalConfig(); globalConfig.setOutputDir(System.getProperty("user.dir") + "/src/main/java"); globalConfig.setAuthor("yourName"); globalConfig.setOpen(false); globalConfig.setServiceName("%sService"); // 去掉默认的 I 前缀 autoGenerator.setGlobalConfig(globalConfig); // 数据源配置 DataSourceConfig dataSourceConfig = new DataSourceConfig(); dataSourceConfig.setDbType(DbType.MYSQL); dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"); dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver"); dataSourceConfig.setUsername("root"); dataSourceConfig.setPassword("password"); autoGenerator.setDataSource(dataSourceConfig); // 包配置 PackageConfig packageConfig = new PackageConfig(); packageConfig.setModuleName("your_module"); packageConfig.setParent("com.example.demo"); autoGenerator.setPackageInfo(packageConfig); // 策略配置 StrategyConfig strategyConfig = new StrategyConfig(); strategyConfig.setNaming(NamingStrategy.underline_to_camel); // 表名转驼峰 strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel); strategyConfig.setEntityLombokModel(true); // 使用 Lombok strategyConfig.setRestControllerStyle(true); // Controller 使用 RestController 注解 strategyConfig.setInclude("your_table"); // 需要生成的表名 autoGenerator.setStrategy(strategyConfig); // 执行生成 autoGenerator.execute(); } } ``` ### ### 自定义类型转换 对于数据库字段类型如 `tinyint(1)` 被错误映射为 `Boolean` 的问题,可以自定义 `MySqlTypeConvert` 来避免这种情况。通过重写类型转换逻辑,确保字段类型映射正确: ```java import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert; import com.baomidou.mybatisplus.generator.config.rules.DbColumnType; public class MySqlTypeConvertCustom extends MySqlTypeConvert { @Override public DbColumnType processTypeConvert(String fieldType) { if (fieldType.toLowerCase().contains("tinyint(1)")) { return DbColumnType.INTEGER; // 强制映射为 Integer } return super.processTypeConvert(fieldType); } } ``` 在代码生成器中注入自定义的类型转换器: ```java autoGenerator.setCfg(new InjectionConfig() { @Override public void initMap() { // 可以注入额外的配置 } }); autoGenerator.setTypeConvert(new MySqlTypeConvertCustom()); ``` ### ### 模板自定义 如果需要进一步自定义生成的代码模板,可以替换默认的 `velocity` 模板文件。将自定义的 `.vm` 文件放入资源目录,并在代码生成器中指定模板路径: ```java TemplateConfig templateConfig = new TemplateConfig(); templateConfig.setEntity("templates/entity.java.vm"); templateConfig.setMapper("templates/mapper.java.vm"); templateConfig.setXml("templates/mapper.xml.vm"); templateConfig.setService("templates/service.java.vm"); templateConfig.setServiceImpl("templates/serviceImpl.java.vm"); templateConfig.setController("templates/controller.java.vm"); autoGenerator.setTemplate(templateConfig); ``` ### ### 结果展示 运行代码生成器后,将在指定的输出目录中生成包含 `Entity`、`Mapper`、`Service` 和 `Controller` 的代码文件。生成的代码会基于数据库表结构自动映射字段和方法,极大提升开发效率 [^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值