MyBatis generator - 简单使用(2)- 配置详解

一、官方相关文档

  • github:https://github.com/mybatis/generator
  • 文档:http://mybatis.org/generator/index.html

二、常用标签详解

上一篇博客 1.MyBatis generator - 简单使用(1) 大概过了一遍生成需要配置的基本属性,这篇主要具体介绍下常用的4类标签的属性配置:

  • javaModelGenerator标签:实体类包名、存放目录配置
  • javaClientGenerator标签:Dao包名、存放目录配置
  • sqlMapGenerator标签:xml包名、存放目录、生成方式配置
  • table标签:表的配置,进一步配置实体类、Dao、xml文件

2.1 javaModelGenerator标签

用于设置生成java实体类的包名和实体类存放的目录。

实体类名等配置参考2.4<table>标签配置

(1)标签的属性:

属性必填描述
targetPackage简单可以理解为实体类的包名
targetProject实体类存放目录,目录不存在,则会创建目录。可以是相对路径:在本项目中生成;也可以是具体某个项目的绝对路径

(2)子标签:仅支持<property>

(3)property支持的配置:

属性名默认值描述
constructorBasedfalse是否为实体类生成构造方法;immutable=true,则本属性会被设置为true;本属性可以被<table>标签相关的属性覆盖
enableSubPackagesfalse是否根据表的catalog和schema生成不同的包。例如order表的schema是my_schema,targetPackage=com.momo.test,本属性为true时,实体类的包:com.momo.test.my_schema
exampleTargetPackageExample类的包名,默认是实体类所在的包
exampleTargetProjectExample类存放的目录,默认是实体类所在的目录
immutablefalse是否生成不可变的实体类,也就是只有构造方法,没有setter
rootClass所有实体类的父类,如果父类定义了一些字段以及对应的getter、setter方法,那么实体类中就不会再生成。必须要类的安全限定名,如com.momo.test.BasePo
trimStringsfalse是否去除空白字符,假如数据库中有char类型的字段会有用。可以被<table><columnOverride>标签的 trimStrings 覆盖

示例:

<context id="context1" targetRuntime="MyBatis3" >
	<!-- 实体类配置 -->
	<javaModelGenerator targetPackage="com.momo.test.order.po" targetProject="src/main/java">
		<property name="trimStrings" value="true"/>
    </javaModelGenerator>
</context>

2.2 javaClientGenerator标签

生成Dao接口(Mapper)

(1)标签的属性:

属性必填描述
typedao代码生成风格,或指定自定义的生成器。可选值:ANNOTATEDMAPPER、MIXEDMAPPER、XMLMAPPER
targetPackageDao的包名
targetProjectDao存放目录,目录不存在,则会创建目录。可以是相对路径:在本项目中生成;也可以是具体某个项目的绝对路径

type属性:

  • 可选值:
    • ANNOTATEDMAPPER:注解风格的Mapper,会生成xxxMapper.javaxxxSqlProvider.java,不生成xxxMapper.xml,此时就算配置了<sqlMapGenerator>标签也不起作用了(参考2.3)
    • MIXEDMAPPER:混合式的Mapper,会生成注解风格的xxxMapper.javaxxxMapper.xml
    • XMLMAPPER:XML的Mapper,会生成纯接口风格的xxxMapper.javaxxxMapper.xml
  • 自定义代码生成器
    • 自定义的生成器必须继承org.mybatis.generator.codegen.AbstractJavaClientGenerator,且有public默认的构造方法
  • 注:
    • <context>标签的 targetRuntime 属性是 MyBatis3Simple,那么可选值:ANNOTATEDMAPPER、XMLMAPPER

(2)子标签:仅支持<property>

(3)property支持的配置:

属性名默认值描述
enableSubPackagesfalse是否根据表的catalog和schema生成不同的包。例如order表的schema是my_schema,targetPackage=com.momo.test,本属性为true时,实体类的包:com.momo.test.my_schema
rootInterfacefalse所有Dao的父类,如果父类定义了一些方法,那么Dao中就不会再生成。必须要类的安全限定名,如com.momo.test.BaseDao
useLegacyBuilderfalsetrue,注解的方法会使用MyBatis的SqlBuilder生成动态SQL;在MyBatis3.2及后续版本中,这种builder废弃了

示例:

<context id="context1" targetRuntime="MyBatis3" >

	<!-- DAO,type:ANNOTATEDMAPPER、MIXEDMAPPER、XMLMAPPER -->
	<javaClientGenerator type="XMLMAPPER" targetPackage="com.momo.test.order.mapper" targetProject="src/main/java">
		<property name="enableSubPackages" value="true" />
	</javaClientGenerator>
</context>

2.3 sqlMapGenerator标签

用于定义SQL映射生成器的属性,该生成器为每张表构造一个MyBatis风格的SQL映射xml(xxxMapper.xml)。

注:

  • <javaClientGenerator>的type属性为ANNOTATEDMAPPER,那么该标签会被忽略
  • 若没有<javaClientGenerator>标签:
    • 但是有<sqlMapGenerator> 标签:只会生成实体类和xml文件
    • 也没有<sqlMapGenerator>标签:只会生成实体类

(1)标签的属性:

属性必填描述
typedao代码生成风格,或指定自定义的生成器。可选值:ANNOTATEDMAPPER、MIXEDMAPPER、XMLMAPPER
targetPackagexml文件的包名
targetProjectxml文件存放目录,目录不存在,则会创建目录。可以是相对路径:在本项目中生成;也可以是具体某个项目的绝对路径

(2)子标签:仅支持<property>

(3)property支持的配置:

属性名默认值描述
enableSubPackagesfalse是否根据表的catalog和schema生成不同的包。例如order表的schema是my_schema,targetPackage=com.momo.test,本属性为true时,实体类的包:com.momo.test.my_schema

示例:

<context id="context1" targetRuntime="MyBatis3" >
	<!-- xxxMapper.xml -->
	<sqlMapGenerator targetPackage="com.momo.test.mapper" targetProject="src/main/java">
		<property name="enableSubPackages" value="true" />
	</sqlMapGenerator>
</context>

2.4 table标签

指定数据库中表,生成对应的实体类。

(1)标签的属性:

属性必填默认值描述
tableName表名,不包括schema或catalog
schema数据库的schema,若数据库没有使用schema或使用的是默认schema,不需要配置
catalog数据库的catalog,若数据库没有使用catalog或使用的是默认catalog,不需要配置
alias别名,若配置别名t,则列名=t_列名,表名:select * from user t,对实体类无影响
domainObjectName类名,若不指定则根据表名生成,包括实体类、Dao、xml文件名称
mapperNameDao、xml文件名称,默认是domainObjectName+Mapper,若指定该属性,则使用配置的值作为Dao、xml。该属性可以是 xxxMapper,也可以是 foo.xxxMapper,foo包会被添加到<sqlMapGenerator>标签targetPackage属性后面
sqlProviderNametrueSqlProvider类名,默认是domainObjectName+SqlProvider,该属性只有在<javaClientGenerator>标签的type=ANNOTATEDMAPPER才会起作用
enableInserttrue是否生成insert语句
enableSelectByPrimaryKeytrue是否生成根据主键查询,若表没有主键,则不生成
enableSelectByExampletrue是否生成根据Example查询,开启后就会生成 xxxExample类,Mapper和xml会生成对应的方法
enableUpdateByPrimaryKeytrue是否生成根据主键更新,若表没有主键,则不生成
enableDeleteByPrimaryKeytrue是否生成根据主键删除,若表没有主键,则不生成
enableCountByExampletrue是否生成根据Example统计
enableUpdateByExampletrue是否生成根据Example更新
selectByPrimaryKeyQueryId若配置了值,如:id001, 那么根据主键查询语句里新增 'id001' as QUERYID,DBA定位查询时比较好使
selectByExampleQueryId若配置了值,如:id001, 那么根据Example查询语句里新增 'id001' as QUERYID,DBA定位查询时比较好使
modelType生成实体类方式,若不指定,使用默认的生成方式;可选值:conditionalflathierarchical;hierarchical:这种方式会生成三个实体类,主键、BLOB列、普通列;flat:只生成一个实体类;conditional:和hierarchical类似,假如实体类只有一个字段,就不会生成,会被合并到主的实体类中,例如只有一个主键,那么就不会为主键单独生成一个类
escapeWildcardsfalse在搜索列时是否转义schema和表中的SQL通配符(“ _”和“%”)
delimitIdentifiersfalse搜索表时是否区分大小写,然后生成的SQL中添加标识符。例如配置的标识符是``,那么在出现表名的地方就会添加这个标识符,select * from `user`,分隔符可以在<context>标签下通过beginningDelimiterendingDelimiter配置
delimitAllColumnsfalse是否对表的所有列添加分隔符,分隔符的配置同上;可以通过<columnOverride>为每个属性配置是否需要分隔

(2)子标签

  • <property>:属性
  • <generatedKey>:生成获取自增长id的语句
  • <domainObjectRenamingRule>:实体类命名规则
  • <columnRenamingRule>:列命名规则
  • <columnOverride>:列配置,会覆盖table标签上的配置
  • <ignoreColumn>:忽略的列

(3)property标签支持的配置:

属性名默认值描述
constructorBasedfalse为实体类生成一个构造方法,没有setter方法。若immutable=true,则该属性强制为true
ignoreQualifiersAtRuntimefalse是否在生成SQL时在表前添加schema或catalog
immutablefalse是否生成不可变的实体类,也就是只有构造方法,没有setter
modelOnlyfalse是否仅生成实体类,此时不生成xxxMapper.java,若配置了<sqlMapGenerator>,会生成xxxMapper.xml,但只生成<resultMap>元素
rootClass所有实体类的父类,如果父类定义了一些字段以及对应的getter、setter方法,那么实体类中就不会再生成。必须要类的安全限定名,如`com.momo.test.BasePo
rootInterface所有Dao的父类,如果父类定义了一些方法,那么Dao中就不会再生成。必须要类的安全限定名,如com.momo.test.BaseDao
runtimeCatalog若配置了该属性,则在生成SQL使用配置的值作为catalog
runtimeSchema若配置了该属性,则在生成SQL使用配置的值作为catalog
runtimeTableName若配置了该属性,则在生成SQL使用配置的值作为表名,上面配置的表名用于连接数据读取字段使用
selectAllOrderByClauseselectAll方法生成order by xxx,例如配置c_time desc,就会生成 order by c_time desc。此配置仅在<context>标签的targetRuntime配置为MyBatis3Simple才起作用
trimStringsfalse是否去除空白字符,假如数据库中有char类型的字段会有用。可以覆盖<javaModelGenerator>标签的配置,被<columnOverride>标签的 trimStrings 覆盖
useActualColumnNamesfalse是否使用实际的数据库列名生成实体类,例如START_DATE,那么实体类就是START_DATE,getter、setter方法就是getSTART_DATE()、setSTART_DATE()。默认false,则为startDate,getStartDate()、setStartDate()
useColumnIndexesfalse在结果映射,使用列的索引而不是列名作为,此配置在<context>标签的targetRuntime配置为MyBatis3不起作用
useCompoundPropertyNamesfalse是否通过 列名+列注释 作为实体类的字段,例如:列名是 FLD2237,注释是:customer id,那么实体类的字段则为 FLD2237_CustomerId。这可能在第4代语言创建的数据库中有点用处

示例:

<context id="context1" targetRuntime="MyBatis3" >

	<property name="autoDelimitKeywords" value="true"/>
    <property name="beginningDelimiter" value="`"/>
    <property name="endingDelimiter" value="`"/>

    <table tableName="product_item" domainObjectName="ProductItem" 
			delimitIdentifiers="true" delimitAllColumns="true" 
			enableCountByExample="false" enableDeleteByExample="false"
			enableSelectByExample="false" enableUpdateByExample="false">
		<property name="trimStrings" value="true"/>
        <!-- 获取自增主键 -->
        <generatedKey column="id" sqlStatement="MySql"/>
    </table>
</context>

三、其他标签

3.1 context标签

生成一系列实体、Dao、XML的环境(上下文)。子标签用于指定数据库连接、实体类和Dao的类型、要插入的表。

可以配置多个<context>标签,用于从不同数据库生成对象,或配置不同的生成参数。

(1)标签的属性:

属性必填默认值描述
id上下文的唯一标识。一些错误信息会和该id关联
defaultModelTypeconditional默认的实体类生成方式,可选值:conditional、flat、hierarchical,含义参考2.3<table>标签的modelType属性
targetRuntimeMyBatis3DynamicSql生成代码的运行时目标,可选值:MyBatis3DynamicSql、MyBatis3Kotlin、MyBatis3、MyBatis3Simple、MyBatis3DynamicSqlV1
introspectedColumnImpl自定义列的信息,填写类的完全类限定名,该类需要继承org.mybatis.generator.api.IntrospectedColumn

targetRuntime属性:

  • MyBatis3DynamicSql:默认,生成的对象适配MyBatis3.4.2及以上、Java8及以上版本(用到了java8一些特性),有以下注意点:
    • 实体类以FLAT方式生成,忽略defaultModelType设置的值;同时不会生成with BLOBs"without BLOBs方法
    • Dao以注解方式生成,忽略<javaClientGenerator>标签的type属性设置的值
    • 不会生成XML文件,所以<sqlMapGenerator>标签无需配置
    • <table>标签的alias设置的值会被忽略,因为
  • MyBatis3Kotlin:Kotlin语言,生成的对象适配MyBatis3.0及以上、Java5及以上版本
  • MyBatis3:生成的对象适配MyBatis3.4.2及以上版本
    • 默认会生成Example方法,用于支持动态查询
    • 生成的代码用到了Java5的许多特性,如参数化类型、注解
  • MyBatis3Simple:生成的对象适配MyBatis3.4.2及以上版本
    • 和MyBatis3类似,不过只会生成CRUD方法
    • 不生成Example
  • MyBatis3DynamicSqlV1:已废弃,后续版本可能会被移除

(2)子标签:

  • <property>:属性,0或多
  • <plugin>:插件,0或多
  • <commentGenerator>:注释生成器,最多1个
  • <connectionFactory>:和jdbcConnection二选一
  • <jdbcConnection>:和connectionFactory二选一
  • <javaTypeResolver>:java类型解析器,最多1个
  • <javaModelGenerator>:实体类配置,必须且只能配置1个
  • <sqlMapGenerator>:XML配置,最多1个
  • <javaClientGenerator>:Dao配置,最多1个
  • <table>:表配置,至少1个

(3)property支持的配置:

属性名默认值描述
autoDelimitKeywordsfalse数据库关键词分隔符,默认""分隔,例如type、name、status都属于MySQL的关键词。查看MyBatis支持的关键词org.mybatis.generator.internal.db.SqlReservedWords
beginningDelimiter"开始的分隔符,可以分隔关键词、表名、所有列,可以在<table>标签中配置列是否需要分隔符
endingDelimiter"结束的分隔符,可以分隔关键词、表名、所有列
javaFileEncodingfalse生成的Java文件编码,若已存在的文件,在合并时将会使用该编码进行读取和写入
javaFormatterfalse自定义Java格式化器,默认的格式化器org.mybatis.generator.api.dom.DefaultJavaFormatter,自定义的格式化器需要实现org.mybatis.generator.api.JavaFormatter,以及有个无参的默认构造方法
targetJava8true生成的代码使用Java8+特性
kotlinFileEncodingfalsekotlin文件编码
kotlinFormatterfalsekotlin代码格式化器
xmlFormatterfalseXML文件格式化器,默认org.mybatis.generator.api.dom.DefaultXmlFormatter,自定义的格式化器需要实现org.mybatis.generator.api.XmlFormatter,以及有个无参的默认构造方法

示例:

<generatorConfiguration>
	<!-- 上下文,可配置多个,id唯一 -->
    <context id="context1" targetRuntime="MyBatis3">
		
		<!-- 分隔数据库关键词 -->
        <property name="autoDelimitKeywords" value="true"/>
        <!-- 分隔符 -->
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
		
		<!-- 插件 -->
        <!--<plugin type="org.mybatis.org.mybatis.generator.plugins.MySqlPaginationPlugin"/>-->

		<!-- 不生成注释 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <!-- 修改mysql 数据源 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3306/test"
                        userId="root" password="root"/>
    </context>
</generatorConfiguration>

附上一份比较常用的配置:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "src/main/org/mybatis/generator/config/xml/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
	<!-- 上下文,可配置多个,id唯一 -->
    <context id="context1" targetRuntime="MyBatis3">

		<!-- 分隔符 -->
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
		
		<!-- 不生成注释 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <!-- 2.修改mysql 数据源 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3306/test"
                        userId="root" password="root"/>

        <!-- 3.修改Bean、Dao、xml存放目录 -->
        <!-- 生成实体类类 -->
        <javaModelGenerator targetPackage="com.momo.test.biz.trade.po" targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

        <!-- 生成 xxxMapper.xml -->
        <sqlMapGenerator targetPackage="com.momo.test.mapper" targetProject="src/main/java">
        </sqlMapGenerator>

        <!-- 生成Dao,xxxMapper.java -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.momo.test.biz.order.mapper" targetProject="src/main/java">
        </javaClientGenerator>

		<!-- 表配置,指定表名、列分隔,不生成Example,获取自增长id -->
        <table tableName="product_item" domainObjectName="ProductItem" 
				delimitIdentifiers="true" delimitAllColumns="true" 
				enableCountByExample="false" enableDeleteByExample="false"
				enableSelectByExample="false" enableUpdateByExample="false">
			<property name="trimStrings" value="true"/>
        	<!-- 获取自增主键 -->
        	<generatedKey column="id" sqlStatement="MySql"/>
    	</table>
    </context>
</generatorConfiguration>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关于mybatis-generator的columnOverride,您可以在mybatis generator官方文档中找到具体的用法和配置信息。在使用mybatis-generator时,可以通过配置文件generatorConfig.xml来指定columnOverride,它用于覆盖数据库表中某个列的属性。例如,您可以通过设置columnOverride来指定某个列的javaType、jdbcType等属性,从而自定义生成的代码。 另外,使用mybatis-generator需要准备数据库驱动、mybatis-generator配置文件generatorConfig.xml以及官方的jar包。在运行mybatis-generator时,它会根据数据库表的信息自动生成mapper文件、dao、实体类等代码文件。 总结来说,mybatis-generator是一个用于自动生成mybatis代码的工具,它可以根据数据库表结构自动生成相应的代码文件。columnOverride是其中的一个配置选项,用于自定义覆盖数据库表中某个列的属性。您可以根据官方文档和示例来学习更多关于mybatis-generator的用法和配置信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [mybatis generator columnOverride](https://blog.csdn.net/m0_67401153/article/details/124314205)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [(十七)Mybatis-generator代码自动生成用法详解](https://blog.csdn.net/weixin_43888891/article/details/110010599)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值