概述

我们前面的博文中了解了MyBatis的基本用法,也写了很多单表的CRUD方法,基本上每个表都需要用到这些方法,这些方法都很规范而且比较类似。

当数据库表的字段较少时,写起来还能接受,一旦字段过多或者需要在很多个表中写这些基本方法的时候,是不是很崩溃?

MyBatis开发团队提供了一个很强大的代码生成器—MyBatis Generator (MBG).

MBG通过丰富的配置可以生成不同类型的代码,代码包含了数据库表对应的实体类、Mapper接口类、Mapper XML文件和 Example对象等。 这些代码文件几乎包含了全部的单表操作方法。

使用MBG可以极大程度上方便我们使用MyBatis,减少很多重复操作。

参考配置实例
在项目的src/main/resources中创建一个generator目录,在该目录下创建一个generatorConfig.xml文件

内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><!-- 配置生成器 -->
<generatorConfiguration> <!-- 引用外部配置文件 --><properties resource="db.properties" /><!-- 在MBG工作的时候,需要额外加载的依赖包location属性指明加载jar/zip包的全路径 --><!--<classPathEntry location="F:\.m2\repository\mysql\mysql-connector-java\5.1.38\mysql-connector-java-5.1.38.jar"/>--><!-- id:必选,上下文id,用于在生成错误时提示targetRuntime:如果设置为MyBatis3,会自动生成Example相关的代码,如果不需要可以设置为MyBatis3Simple-MyBatis3:默认的值,生成基于MyBatis3.x以上版本的内容,包括XXXBySample;-MyBatis3Simple:类似MyBatis3,只是不生成XXXBySample;defaultModelType:指定生成对象的样式设置为flat,目的是只使一个表生成一个实体类。 当没有复杂的继承的时候,使用比较方便。选项如下-conditional:类似hierarchical;-flat:所有内容(主键,blob)等全部生成在一个对象中;-hierarchical:主键生成一个XXKey对象(key class),Blob等单独生成一个对象,其他简单属性在一个对象中(record class)--><context id="MySqlContext" targetRuntime="MyBatis3" defaultModelType="flat"><!-- beginningDelimiter/endingDelimiter: 指明数据库的用于标记数据库对象名的符号,比如ORACLE是双引号,MYSQL默认是`反引号  --><property name="beginningDelimiter" value="`"/><property name="endingDelimiter" value="`"/><!-- 生成的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"/>--><!-- commentGenerator还可以配置一个type,设置自己的注解生成器,默认使用的是org.mybatis.generator.internal.DefaultCommentGenerator --><commentGenerator><!-- suppressDate是去掉生成日期那行注释,suppressAllComments是去掉所有的注解 --><property name="suppressDate" value="true"/><!-- 在生成的实体类中附带表字段的注释  MBG1.3.3中新增的功能 --><property name="addRemarkComments" value="true"/></commentGenerator><!-- 必须存在,使用这个配置链接数据库--><jdbcConnection driverClass="${jdbc.driver}"connectionURL="${jdbc.url}"userId="${jdbc.username}"password="${jdbc.password}"><!-- 这里面可以设置property属性,每一个property属性都设置到配置的Driver上 --></jdbcConnection><!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal <javaTypeResolver><property name="forceBigDecimals" value="false" /></javaTypeResolver>--><!-- java模型创建器,是必须要的元素负责:1,key类(见context的defaultModelType);2,java类;3,查询类targetPackage:生成的类要放的包,真实的包受enableSubPackages属性控制;targetProject:目标项目,指定一个存在的目录下,生成的内容会放到指定目录中,如果目录不存在,MBG不会自动建目录--><javaModelGenerator targetPackage="test.model" targetProject="src\main\java"><!-- 设置是否在getter方法中,对String类型字段调用trim()方法 --><property name="trimStrings" value="true" /><!-- 设置一个根对象, 如果设置了这个根对象,那么生成的keyClass或者recordClass会继承这个类;在Table的rootClass属性中可以覆盖该选项 注意:如果在key class或者record class中有root class相同的属性,MBG就不会重新生成这些属性了,包括: 1,属性名相同,类型相同,有相同的getter/setter方法;如果生成对象生成的类型或者getter和setter方法在RootClass中存在,则不会自动生成和覆盖 --><property name="rootClass" value="com.artisan.mybatis.simple.model.BaseEntity" /><!-- 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"/> --></javaModelGenerator><!-- 生成SQL map的XML文件生成器,注意,在Mybatis3之后,我们可以使用mapper.xml文件+Mapper接口(或者不用mapper接口),或者只使用Mapper接口+Annotation,所以,如果 javaClientGenerator配置中配置了需要生成XML的话,这个元素就必须配置targetPackage/targetProject:同javaModelGenerator--><sqlMapGenerator targetPackage="test.xml"  targetProject="src\main\resources"><!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false <property name="enableSubPackages" value="true"/> --></sqlMapGenerator><!-- 对于mybatis来说,即生成Mapper接口,注意,如果没有配置该元素,那么默认不会生成Mapper接口 targetPackage/targetProject:同javaModelGeneratortype:选择怎么生成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 type="XMLMAPPER" targetPackage="test.dao"  targetProject="src\main\java"><!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false <property name="enableSubPackages" value="true"/> --><!-- 可以为所有生成的接口添加一个父接口,但是MBG只负责生成,不负责检查 <property name="rootInterface" value=""/> --></javaClientGenerator><!-- 选择一个table来生成相关文件,可以有一个或多个table,必须要有table元素选择的table会生成一下文件:1,SQL map文件2,生成一个主键类;3,除了BLOB和主键的其他字段的类;4,包含BLOB的类;5,一个用户生成动态查询的条件类(selectByExample, deleteByExample),可选;6,Mapper接口(可选)tableName(必要):要生成对象的表名;注意:大小写敏感问题。正常情况下,MBG会自动的去识别数据库标识符的大小写敏感度,在一般情况下,MBG会根据设置的schema,catalog或tablename去查询数据表,按照下面的流程:1,如果schema,catalog或tablename中有空格,那么设置的是什么格式,就精确的使用指定的大小写格式去查询;2,否则,如果数据库的标识符使用大写的,那么MBG自动把表名变成大写再查找;3,否则,如果数据库的标识符使用小写的,那么MBG自动把表名变成小写再查找;4,否则,使用指定的大小写格式查询;另外的,如果在创建表的时候,使用的""把数据库对象规定大小写,就算数据库标识符是使用的大写,在这种情况下也会使用给定的大小写来创建表名;这个时候,请设置delimitIdentifiers="true"即可保留大小写格式;可选:1,schema:数据库的schema;2,catalog:数据库的catalog;3,alias:为数据表设置的别名,如果设置了alias,那么生成的所有的SELECT SQL语句中,列名会变成:alias_actualColumnName4,domainObjectName:生成的domain类的名字,如果不设置,直接使用表名作为domain类的名字;可以设置为somepck.domainName,那么会自动把domainName类再放到somepck包里面;5,enableInsert(默认true):指定是否生成insert语句;6,enableSelectByPrimaryKey(默认true):指定是否生成按照主键查询对象的语句(就是getById或get);7,enableSelectByExample(默认true):MyBatis3Simple为false,指定是否生成动态查询语句;8,enableUpdateByPrimaryKey(默认true):指定是否生成按照主键修改对象的语句(即update);9,enableDeleteByPrimaryKey(默认true):指定是否生成按照主键删除对象的语句(即delete);10,enableDeleteByExample(默认true):MyBatis3Simple为false,指定是否生成动态删除语句;11,enableCountByExample(默认true):MyBatis3Simple为false,指定是否生成动态查询总条数语句(用于分页的总条数查询);12,enableUpdateByExample(默认true):MyBatis3Simple为false,指定是否生成动态修改语句(只修改对象中不为空的属性);13,modelType:参考context元素的defaultModelType,相当于覆盖;14,delimitIdentifiers:参考tableName的解释,注意,默认的delimitIdentifiers是双引号,如果类似MYSQL这样的数据库,使用的是`(反引号,那么还需要设置context的beginningDelimiter和endingDelimiter属性)15,delimitAllColumns:设置是否所有生成的SQL中的列名都使用标识符引起来。默认为false,delimitIdentifiers参考context的属性注意,table里面很多参数都是对javaModelGenerator,context等元素的默认属性的一个复写;--><!-- % 通配符 匹配数据库中所有的表 --><table tableName="%"><!-- generatedKey用于生成生成主键的方法,如果设置了该元素,MBG会在生成的<insert>元素中生成一条正确的<selectKey>元素,该元素可选column:主键的列名;sqlStatement:要生成的selectKey语句,有以下可选项:Cloudscape:相当于selectKey的SQL为: VALUES IDENTITY_VAL_LOCAL()DB2       :相当于selectKey的SQL为: VALUES IDENTITY_VAL_LOCAL()DB2_MF    :相当于selectKey的SQL为:SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1Derby     :相当于selectKey的SQL为:VALUES IDENTITY_VAL_LOCAL()HSQLDB    :相当于selectKey的SQL为:CALL IDENTITY()Informix  :相当于selectKey的SQL为:select dbinfo('sqlca.sqlerrd1') from systables where tabid=1MySql     :相当于selectKey的SQL为:SELECT LAST_INSERT_ID()SqlServer :相当于selectKey的SQL为:SELECT SCOPE_IDENTITY()SYBASE    :相当于selectKey的SQL为:SELECT @@IDENTITYJDBC      :相当于在生成的insert元素上添加useGeneratedKeys="true"和keyProperty属性--><generatedKey column="id" sqlStatement="MySql"/><!-- 参考 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"/> --><!-- 参考 javaModelGenerator 的 rootClass 属性 <property name="rootClass" value=""/>--><!-- 参考javaClientGenerator 的  rootInterface 属性<property name="rootInterface" value=""/>--><!-- 如果设置了runtimeCatalog,那么在生成的SQL中,使用该指定的catalog,而不是table元素上的catalog <property name="runtimeCatalog" value=""/>--><!-- 如果设置了runtimeSchema,那么在生成的SQL中,使用该指定的schema,而不是table元素上的schema <property name="runtimeSchema" value=""/>--><!-- 如果设置了runtimeTableName,那么在生成的SQL中,使用该指定的tablename,而不是table元素上的tablename <property name="runtimeTableName" value=""/>--><!-- 注意,该属性只针对MyBatis3Simple有用;如果选择的runtime是MyBatis3Simple,那么会生成一个SelectAll方法,如果指定了selectAllOrderByClause,那么会在该SQL中添加指定的这个order条件;<property name="selectAllOrderByClause" value="age desc,username asc"/>--><!-- 如果设置为true,生成的model类会直接使用column本身的名字,而不会再使用驼峰命名方法,比如BORN_DATE,生成的属性名字就是BORN_DATE,而不会是bornDate<property name="useActualColumnNames" value="false"/> --><!-- ignoreColumn设置一个MGB忽略的列,如果设置了改列,那么在生成的domain中,生成的SQL中,都不会有该列出现 column:指定要忽略的列的名字;delimitedColumnName:参考table元素的delimitAllColumns配置,默认为false注意,一个table元素中可以有多个ignoreColumn元素<ignoreColumn column="deptId" delimitedColumnName=""/>--></table></context>
</generatorConfiguration>

运行 MyBatis Generator

常用的有如下方式:

使用Java编写运行代码
从命令提示符运行
使用Maven Plugin运行
使用Eclipse插件运行
我们这里使用 第一种方式 Java编写代码运行

第一步: 添加Maven依赖

<dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>${mybatis-generator-core.version}</version>
</dependency>

第二步: 编写Java代码

package com.mybatis.generator;import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;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;/*** * * @ClassName: Generator* * @Description: 读取 MBG 配置生成代码* * @author: Mr.Yang* * @date: 2018年4月27日 下午4:31:42*/
public class Generator {public static void main(String[] args) throws Exception {// MBG 执行过程中的警告信息List<String> warnings = new ArrayList<String>();// 当生成的代码重复时,覆盖原代码boolean overwrite = true;// 读取MBG配置文件InputStream is = Generator.class.getResourceAsStream("/generator/generatorConfig.xml");ConfigurationParser cp = new ConfigurationParser(warnings);Configuration config = cp.parseConfiguration(is);is.close();DefaultShellCallback callback = new DefaultShellCallback(overwrite);// 创建 MBGMyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);// 执行生成代码myBatisGenerator.generate(null);// 输出警告信息for (String warning : warnings) {System.out.println(warning);}}}

使用Java编码方式运行的好处是,generatorConfig.xml配置的一些特殊的类(比如commentGenerator标签中type属性配置的MyCommentGenerator)只要在当前项目中,或者在当前项目的Classpath中,就可以直接使用。 使用其他方式的时候都需要特别配置才能在MBG执行过程中找到MyCommentGenerator类并实例化,否则会抛出异常。

不便之处在于,它和当前项目是绑定在一起的, 唉maven多子模块的情况下,可能需要增加代码量和配置量,配置多个,管理不方便。

但是总和来说,这种方式出现的问题最少,配置最为容易,因此推荐使用。

运行后生成的代码如下结构

大致用法,总结完毕

--------------------- 
作者:小小工匠 
来源:CSDN 
原文:https://blog.csdn.net/yangshangwei/article/details/80115361 
版权声明:本文为博主原创文章,转载请附上博文链接!

MyBatis代码生成器(逆向工程)MBG使用相关推荐

  1. 逆向工程MBG(MyBatis Generator)

    文章目录 逆向工程MBG(MyBatis Generator) 概述 MyBatis Generator (MBG) 是 MyBatis MyBatis的代码生成器.它将为所有版本的 MyBatis ...

  2. 5.6 Mybatis代码生成器Mybatis Generator (MBG)实战详解

    文章目录 前言 一.Mybatis Generator简介 二.Maven插件运行方式 三.生成配置 generatorConfig.xml MyBatis3Simple风格 MyBatis3风格 M ...

  3. mybatis逆向工程mbg.xml配置模板( MyBatis Generator)

    mybatis逆向工程mbg.xml配置模板( MyBatis G在数据库中建立好表就可以进行逆向工程配置了,配置逆向工程,只需要两步: (1)在项目目录下配置mbg.xml文件,(2)在测试类运行一 ...

  4. MyBatis代码生成器-Example讲解

    概述 在上篇博文 MyBatis代码生成器(逆向工程)MBG使用 中介绍了MBGZ的基本使用.我们知道在MBG的context中将targetRuntime配置为MyBatis3时,MBG会生成和Ex ...

  5. Mybatis Generator逆向工程的使用

    MyBatis Generator简介 MyBatis Generator(MBG)是MyBatis MyBatis 和iBATIS的代码生成器.它将为所有版本的MyBatis以及版本2.2.0之后的 ...

  6. 怎么运行Mybatis代码生成器MGB

    方式一:作为 Maven Plugin  mvn mybatis-generator:generate 使用场景: 对逆向工程定制较多,项目工程结构比较单一的情况 POM文件下需要以下插件 <b ...

  7. 老司机学习MyBatis之逆向工程MGB的简单使用

    一.前言 MyBatis Generator简称MBG,是一个专门为MyBatis框架使用者定制的代码生成器,可以快速的根据表生成对应的映射文件,接口,以及bean类.支持基本的增删改查,以及QBC风 ...

  8. 从源码构建 MyBatis Generator(MBG)

    从源码构建 所有MyBatis Generator(MBG)发行版包括源代码,唯一的编译时间依赖关系在ant.jar上 - 用于成功编译包含的Ant任务.直接从源代码编译MBG - 只需将源解压缩到一 ...

  9. MyBatis Generator(MBG)从Abator迁移

    此页面详细介绍MyBatis Generator(MBG)和Abator之间的变化.对于大多数用户而言,更改应该很简单.如果您扩展了Abator的任何类以提供代码生成器或Java类型解析器的自定义实现 ...

  10. Mybatis代码生成器Mybatis-Generator使用及配置详解

    Mybatis-Generator使用及配置 文章目录 Mybatis-Generator使用及配置 前言 一.MyBatis Generator是什么? 二.使用步骤 1.引入maven依赖 2.引 ...

最新文章

  1. html json 访问工程,SpringBoot:Web项目中如何优雅的同时处理Json和Html请求的异常...
  2. WEB安全:XSS漏洞与SQL注入漏洞介绍及解决方案
  3. 实用的it知识学习_怎样能更快更好的学习好书法?分享一些比较实用的理论知识...
  4. linux安装python3.7的步骤_Linux 安装python3.7.3
  5. 转载-----Java Longest Palindromic Substring(最长回文字符串)
  6. java cipher.dofinal_cipher.dofinal方法
  7. 服装进销存软件哪个好?十大优质服装进销存管理软件排名
  8. 网络操作系统项目教程----Windows server 2003篇----服务器远程管理与监控
  9. 全国计算机二级flash,教你如何在Flash当中制作插按钮动画
  10. a36.ansible 生产实战案例 -- 基于kubeadm安装kubernetes v1.23 -- 集群部署(一)
  11. 如何回答「为什么想来我们公司」【面试核心问题2】
  12. Windows 查看已保存wifi密码
  13. mac无法调节屏幕亮度
  14. 弗洛伊德算法(Java)
  15. 内丘计算机学校,内丘学校食堂打卡机
  16. 小波变化笔记-Wavelet Tutorial - Part 3
  17. element双输入框开始时间结束时间验证
  18. 递归的逻辑(1)——递归关系模型
  19. 小马哥---山寨仿苹果6 主板型号E255 低端仿机 芯片6571 拆机主板图与开机界面图
  20. Windows10ISO英语 20h2原版系统镜像2021年5月份版

热门文章

  1. Android图表和图形创建库:EazeGraph
  2. 深入JUnit源码之Rule
  3. 动态语言,静态类型,强类型定义语言,弱类型定义语言,
  4. poj 3177 Redundant Paths
  5. 第1章、从零开始学Android
  6. Pycharm Matplotlib 图像不显示问题
  7. ICE简单介绍及使用示例
  8. 高速缓存系统之redis c++使用实例
  9. C++中的内存管理(new、delete、内存泄漏)
  10. OpenCV黑白图像增强——灰度级切片