Java的MyBatis框架中MyBatis Generator代码生成器的用法

关于Mybatis Generator
MyBatis Generator (MBG) 是一个Mybatis的代码生成器 MyBatis 和 iBATIS. 他可以生成Mybatis各个版本的代码,和iBATIS 2.2.0版本以后的代码。 他可以内省数据库的表(或多个表)然后生成可以用来访问(多个)表的基础对象。 这样和数据库表进行交互时不需要创建对象和配置文件。 MBG的解决了对数据库操作有最大影响的一些简单的CRUD(插入,查询,更新,删除)操作。 您仍然需要对联合查询和存储过程手写SQL和对象。

MyBatis Generator 会生成:

匹配表结构的Java POJO,可能包括:

  • 一个和表主键匹配的类(如果存在主键[注:只有联合主键会有])
  • 一个包含了非主键字段的类(BLOB字段除外[注:单字段做主键时这里会包含])
  • 一个包含了BLOB字段的类 (如果表包含了BLOB字段)
  • 一个允许动态查询、更新和删除的类[注:指的是Example查询]

这些类之间会有适当的继承关系。 请注意可以配置生成器来生成不同类型的 POJO 的层次结构。 例如,如果您愿意您可能会选择针对每个表生成一个单独的实体对象。

MyBatis/iBATIS 兼容 SQL 映射 XML 文件。MBG 在配置中为每个表简单的 CRUD 操作生成 SQL。 生成的 SQL 语句包括:

  • insert (插入)
  • update by primary key (根据主键更新记录)
  • update by example (根据条件更新记录)
  • delete by primary key (根据主键删除记录)
  • delete by example (根据条件删除记录)
  • select by primary key (根据主键查询记录)
  • select by example (根据条件查询记录集)
  • count by example (根据条件查询记录总数)

根据表的结构,生成的这些语句会有不同的变化(例如,如果表中没有主键,那么 MBG 将不会生成update by primary key方法)。

Java客户端类会适当的使用上面的对象,生成Java客户端类时可选的。 MBG会为MyBatis 3.x生成如下客户端类:
一个可以和MyBatis 3.x一起使用的mapper接口类
MBG会为iBATIS 2.x生成如下的客户端类:
符合 Spring 框架的DAO类。
只使用iBATIS SQL映射API的DAO。 这种DAO可以通过下面两种方式生成:提供SqlMapClient通过构造方法或者setter注入。
符合iBATIS DAO 框架的DAO (iBATIS可选的一部分,这一框架已经过时,我们建议您使用Spring框架替代)。
MyBatis generator 可以在迭代开发环境中良好的运行, 在持续的构建环境中作为一个ant任务或maven插件。 运行MBG时要记住以下重要的事:

MBG 会自动合并已经存在并且和新生成的文件重名的 XML。MBG 不会覆盖您对已经生成xml所做的修改。 您可以反复的运行而不必担心失去您自定义的更改。 MBG 将取代所有以前运行中生成的 XML 元素。
MBG 不会 合并 Java 文件,他可以覆盖已经存在的文件或者保存新生成的文件为一个不同的唯一的名字。 您可以手动合并这些更改。 当您使用Eclipse 插件时, MBG 可以自动合并 Java 文件.

基本用法
MBG的运行主要依靠一份XML配置文件,首先我们可以重新新建一个项目名为MybatisGenerator,新建3个包分别名叫config,david.test,与david.mbg,config包主要存放真正的Mybatis里面需要用到的配置文件,可以把前几章中项目中的mybatis_demo_config.xml拷贝过来放在这个目录下,等等用作测试程序之用,david.test顾名思义就是存放以下常用的方法和测试程序大家也可以吧前几章中用到MybatisUtils工具类拿过来,新建好相应的MainFunction以备测试之用。而最后的david.mbg中就是我们今天要配置的XML,MBG生成配置文件。

 如图所示,我们在下面新建好一个名为mbg_configuration.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>
  <classPathEntry
    location="./lib/mysql-connector-java-5.1.26-bin.jar" />
  <context id="mybatisDemoForMysql" targetRuntime="MyBatis3">
    <!-- 控制注释 -->
    <commentGenerator>
      <!-- 是否去除所有自动生成的注释文件 -->
      <property name="suppressAllComments" value="true" />
      <!-- 是否去除所有自动生成的文件的时间戳,默认为false -->
      <property name="suppressDate" value="true" />
    </commentGenerator>
    <!-- 控制数据库 -->
    <jdbcConnection driverClass="com.mysql.jdbc.Driver"
      connectionURL="jdbc:mysql://127.0.0.1:3306/mybatis_db?characterEncoding=utf8"
      userId="root" password="david0110" />

    <javaTypeResolver>
      <!-- 把jdbc中的decimal与numberic类型转化为integer类型 -->
      <property name="forceBigDecimals" value="false" />
    </javaTypeResolver>
    <!-- 数据库表对应的model -->
    <javaModelGenerator targetPackage="david.model"
      targetProject="src">
      <property name="enableSubPackages" value="true" />
      <property name="trimStrings" value="true" />
    </javaModelGenerator>
    <!-- 控制Model的xmlMapper文件 -->
    <sqlMapGenerator targetPackage="david.mappers"
      targetProject="src">
      <property name="enableSubPackages" value="true" />
    </sqlMapGenerator>
    <!-- 控制mapper接口 -->
    <javaClientGenerator targetPackage="david.inter"
      type="XMLMAPPER" targetProject="src">
      <property name="enableSubPackages" value="true" />
      <property name="methodNameCalculator" value="extended" />
    </javaClientGenerator>
    <!-- schema你的数据库,tableName表明,domainObjectName对应你的javabean类名,是否生成相应的example -->
    <table schema="mybatis_db" tableName="visitor" domainObjectName="Visitor"
      enableCountByExample="false" enableUpdateByExample="false"
      enableDeleteByExample="false" enableSelectByExample="false"
      selectByExampleQueryId="false">
      <generatedKey column="id" sqlStatement="MySql" />
      <columnOverride column="name" property="visitor_name" />
      <ignoreColumn column="status" delimitedColumnName="false" />
    </table>
  </context>
</generatorConfiguration>

大家可以注意到其实主要是这几个节点

  <classPathEntry>=> 存放jdbc驱动包的位置,可以采用相对路径,也可以采用绝对路径,此处示例中采用了相对路径

  <context>=>对应一个数据库下所有表的配置,可以有多个context,一个配置mysql,一个配置oracle。

  <context>节点下主要有:

    <commentGenerator> => 注释生成节点,此示例中下的2个子节点分表代表

      suppressAllComments => 是否去除所有自动生成的注释文件

      suppressDate => 是否去除所有自动生成的文件的时间戳,默认为false

    <jdbcConnection> => 数据库连接配置信息

    <javaTypeResolver> => 把jdbc中的decimal与numberic类型转化为java.math.BigDeciaml形式表示

    <javaModelGenerator> => 配置你的POJO实体类,targetPackage="david.model",对应你的报名,可以自己根据实际业务取名,targetProject="src",在Eclipse环境下,指代的是项目和源文件夹的路径一般是指src目录,你的包都会新建在这个目录下,如果不是Eclipse环境,此处的值应该是个实际存在的文件系统路径,如果指定的路径不存在会报错,因为MBG不会自己创建相应的文件夹

    <sqlMapGenerator> => 配置生成相应的实体Mapper.xml,对于Mapper3.X我们需要把type="XMLMAPPER"

    <javaClientGenerator> => 配置生成相应的接口类,对应与Mapper.xml中的一系列CRUD方法SQL语句

    <table> => 配置相应的数据库,对应的表明与想要生成领域类名(也就是实体类名字),此示例中我关闭了所有不必要的Example生成信息

  上述所有的信息都可以去官网查阅相应文档,或者到我的文件中去下载,里面相应的配置说明与相关应用示例。下载文档

  配置完上面的信息,最后一步是什么呢,我们就是要运行这个脚本文件了,官方说明中有4种方式,第一通过命令行方式,第二,三都是通过Ant或者Maven之类的工具生成,最后一种就是通过Java代码生成,我们这里就采用通过Java大麦生成的方式。在DemoRun类中添加一个生成脚本的方法如下:

private static void generateMbgConfiguration() {
    /*
     * Mybatis自带Generator工具生成相应东西
     */
    List<String> warnings = new ArrayList<String>();
    boolean overwrite = true;
    File configFile = new File("./src/david/mbg/mbg_configuration.xml");
    ConfigurationParser cp = new ConfigurationParser(warnings);
    Configuration config = null;
    try {
      config = cp.parseConfiguration(configFile);
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (XMLParserException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    DefaultShellCallback callback = new DefaultShellCallback(overwrite);
    try {
      MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
      myBatisGenerator.generate(null);
    } catch (InvalidConfigurationException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (SQLException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    System.out.println("生成Mybatis配置成功!");
  }

  运行后再Refresh下项目你会发现下面神奇的帮你生成了主要配置,下图红框部分:

最后我们来使用下自动生成的成果吧,我们可以参照前六章的方式,在DemoRun中添加相应的CRUD测试方法如下:

/*
   * 查询访问者信息
   */
  public static void testGenerateAdd() {
    SqlSession session = MybatisUtils.getSqlSession();
    VisitorMapper vOperation = session.getMapper(VisitorMapper.class);
    Visitor visitor = new Visitor();
    visitor.setVisitor_name("hello2");
    visitor.setEmail("helloworld2@qq.com");
    visitor.setCreatetime(new Date());
    int count = vOperation.insert(visitor);
    session.commit();
    MybatisUtils.closeSession(session);
    MybatisUtils.showMessages(CRUD_Enum.Add, count);
  }

  /*
   * 查询访问者信息
   */
  public static void testGenerateQuery(int id) {
    SqlSession session = MybatisUtils.getSqlSession();
    VisitorMapper vOperation = session.getMapper(VisitorMapper.class);
    Visitor visitor = vOperation.selectByPrimaryKey(id);
    MybatisUtils.closeSession(session);
    MybatisUtils.showMessages(CRUD_Enum.Query, 1);
    System.out.println(visitor);
  }

  public static void testGenerateDelete(int id) {
    SqlSession session = MybatisUtils.getSqlSession();
    VisitorMapper vOperation = session.getMapper(VisitorMapper.class);
    int count = vOperation.deleteByPrimaryKey(id);
    session.commit();
    MybatisUtils.closeSession(session);
    MybatisUtils.showMessages(CRUD_Enum.Delete, count);
  }

  public static void testGenerateUpdate(int id) {
    SqlSession session = MybatisUtils.getSqlSession();
    VisitorMapper vOperation = session.getMapper(VisitorMapper.class);
    Visitor visitor = vOperation.selectByPrimaryKey(id);
    System.out.println(visitor);
    String name = visitor.getVisitor_name();
    if (name.contains("update")) {
      visitor.setVisitor_name(name.substring(0, name.indexOf("update")));
    } else {
      visitor.setVisitor_name(name + "update");
    }
    int count = vOperation.updateByPrimaryKey(visitor);
    session.commit();
    MybatisUtils.closeSession(session);
    MybatisUtils.showMessages(CRUD_Enum.Update, count);
    System.out.println(visitor);
  }

运行下测试程序,结果就出来了

有没有感觉使用这个帮你提高了不少效率,不必在为繁琐的配置而头痛了,至少不用做重复的无谓的步骤了,让这些都交给工具去做吧^0^,当然在实际的使用中我们可能需要在生成后修改相应的类信息与接口信息名字,当然这些工作量已经不是太多了。希望今天这些内容对需要配置的同学有所帮助。

时间: 2016-04-04

Mybatis Generator自动生成对应文件的实现方法

使用Generator自动生成我们需要的bean dao mapper xml等文件的过程(没有借助eclipse等编辑工具直接命令提示符生成) 第一步:在E盘新建一个文件夹generator,在这文件夹下创建一个test文件夹用来存放生成的文件,在创建一个generator.xml的配置文件 第二步:导入需要的jar包 mybatis-generator-core-1.3.2.jar 和mysql-connector-java-5.1.28-bin.jar 第三步:编写generator.xm

mybatis generator 配置 反向生成Entity简单增删改查(推荐)

mybatis generator 配置 反向生成Entity简单增删改查实例代码如下所示: <?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生成代码及使用方式详解

为什么要有mybatis mybatis 是一个 Java 的 ORM 框架,ORM 的出现就是为了简化开发.最初的开发方式是业务逻辑和数据库查询逻辑是分开的,或者在程序中编写 sql 语句,或者调用 sql 存储过程.这样导致思维需要在语言逻辑和 sql 逻辑之间切换,导致开发效率低下.所以出现了一系列的 ORM 框架,ORM 框架将数据库表和 Java 对象对应起来,当操作数据库时,只需要操作对象的 Java 对象即可,例如设置几个 and 条件,只需要设置几个属性即可. 为什么要有myba

详解MyBatis Generator自动创建代码(dao,mapping,poji)

连接的数据库为SQL server2008,所以需要的文件为sqljdbc4.jar 使用的lib库有: 在lib库目录下新建一个src文件夹用来存放生成的文件,然后新建generatorConfig.xml 里面代码为: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis G

MyBatis Generator去掉生成的注解

是不是很讨厌mybatis Generator帮我们生成代码的时候在Mapper和mapper.xml文件中生成的一大堆注解?今天在看MyBatis Generator代码的时候发现,原来mybatis generator是提供了配置注解的能力,配置如下,在generatorConfig.xml中加上配置: <commentGenerator> <property name="suppressDate" value="true"/> <

Mybatis Generator最完美配置文件详解(完整版)

最近没做项目,重新整理了一个最完整的Mybatis Generator(简称MBG)的最完整配置文件,带详解,再也不用去看EN的User Guide了: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"

使用Mybatis Generator结合Ant脚本快速自动生成Model、Mapper等文件的方法

MyBatis简介: MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. 相关阅读:MyBatis入门学习教程(一)-MyBatis快速入门 使用过Mybatis的同学都知道,针对每一个项目中使用到的数据库表都需要建

Eclipse下配置Ant脚本并自动打包带签名的Android apk

eclipse虽然用的比较少,但是在一些古老的项目上还会用到滴,其中最麻烦的事情就是打带签名包的问题,不太方便,下面通过本文给大家记录下配置ant,自动打包带签名apk的过程,作为备份.(PC环境为MAC) 1,第一步得安ant,下载对应安装包,解压后配置环境变量: export ANT_HOME="/Users/yanzi/work/apache-ant-1.9.4" export PATH=${PATH}:${ANT_HOME}/bin 通过which ant检查是否安装成功. 2

Linux在shell中自动生成1到100的数组方法(两种方法)

之前自己在写shell脚本的时候,需要自动创建1-100的文本确不知道该如何去创建.百度一翻终于知道了创建的方法. 在shell脚本中创建1-100的方法很多,那我在这里主要就说两种容易理解且方便的方法: 第一种方法: for i in {1..100} do echo $i done 使用{1..100}这种方式简单明了,大家也可以在linux命令模式下直接:echo {1..100}看一下效果. 第二种方法: 使用seq函数 for i in `seq 1 100` do echo $i d

Vue webpack 项目自动打包压缩成zip文件的方法

这段时间用 Vue2.0 开发项目,每次打包都会用到 npm run build 命令,但是每次部署时给后端发包都要手动zip压缩,这样一两次还行,但遇到项目板块测试和临时加急功能测试的时候,一天可能就要打包好多次,这就很烦了.所以索性在执行 npm run build 命令时就直接打包成zip文件,方便省事! 1.插件装备 webpack插件:filemanager-webpack-plugin,该插件可执行打包,复制,移动,删除文件以及新文件夹在build之前及之后创建. 安装: npm i

laravel-admin自动生成模块,及相关基础配置方法

一.模型创建.数据迁移.以及关联模型控制器 $ php artisan make:model Brand -m //创建模型并生成迁移文件 $ php artisan migrate //运行迁移 $ php artisan admin:make BrandController --model=App\Brand //创建关联Brand模型的控制器 二.问题:创建模型后,会生成一个临时文件(php artisan make:model Brand -m) 路径:database/migratio

python自动生成model文件过程详解

生成方式 Python中想要自动生成 model文件可以通过 sqlacodegen这个命令来生成对应的model文件 sqlacodegen 你可以通过pip去安装: pip install sqlacodegen 格式: sqlacodegen mysql+pymysql://username:password@host/database_name > model.py 说明: mysql+pymysql : 表示连接数据库的连接方式 username : 连接MySQL数据库的用户名 pa

Android中实现自动生成布局View的初始化代码方法

在android开发过程中,界面布局是及其重要的,但同时也是复杂.有的时候我们急于实际运行查看布局效果.但是android的编译速度我实在不想吐槽啥,尤其在布局越来越复杂,项目越来越大,资源文件越来越多的情况下. 尤其是是android的view的初始化,findViewbyId 完全是体力活,我们完全可以根据布局文件自动生成View的初始化代码. 首先声明:   1.这是及其容易做到的,实用性性一般,但是在复杂布局和首次写初始化View代码的时候及其好用. 2.只能生成有id标签的view的初

lua脚本实现自动生成APK包

可以根据需要自行扩展了. 使用前tool path 还有 target path的前两个还是需要自己设置下. 一些小的函数 jit_file copy_file 我就不贴了 比较简单,用来luajit 和 拷贝. 复制代码 代码如下: -- Authors: sails鸢@oschina -- Date: 20th , August , 2014 -- Note: -- This is used for Cocos2dx + Lua -- This is a script to making .

PHP自动生成后台导航网址的最佳方法

经常制作开发不同的网站的后台,写过很多种不同的后台导航写法. 最终积累了这种最写法,算是最好的吧.附上截图和代码如下(PHP+HTML)   复制代码 代码如下: <?php $linkArr = array( 'index.php' => '汇总首页', 'List.php' => '列表', 'Detail.php' => '详细', 'http://qzone.qq.com/' => 'QQ空间', 'http://qun.qzone.qq.com/group'=>

如何自动生成Mybatis的Mapper文件详解

前言 工作中使用mybatis时我们需要根据数据表字段创建pojo类.mapper文件以及dao类,并且需要配置它们之间的依赖关系,这样的工作很琐碎和重复,mybatis官方也发现了这个问题,因此给我们提供了mybatis generator工具来帮我们自动创建pojo类.mapper文件以及dao类并且会帮我们配置好它们的依赖关系. 实际上,最非常流行MyBatis-Plus中内置了代码生成器:采用代码或者 Maven 插件可快速生成 Mapper . Model . Service . Co