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^,当然在实际的使用中我们可能需要在生成后修改相应的类信息与接口信息名字,当然这些工作量已经不是太多了。希望今天这些内容对需要配置的同学有所帮助。

(0)

相关推荐

  • 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 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生成代码及使用方式详解

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

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

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

  • 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自动创建代码(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框架中mybatis配置文件详细介绍

    一.注册DB连接四要素属性文件 <propertiesresource="jdbc.properties"/> 二.将指定包中所有类的简单类名当作其别名 <typeAliases> <packagename="com.bjpowernode.beans"/> </typeAliases> 三.配置运行环境 <environmentsdefault="testEM"> <enviro

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

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

  • 详解Java的MyBatis框架中动态SQL的基本用法

    有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Oracle的序列.mysql的函数生成Id.这时我们可以使用动态sql.下文均采用mysql语法和函数(例如字符串链接函数CONCAT). selectKey 标签 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键.使用myBatis的select

  • Java的MyBatis框架中XML映射缓存的使用教程

    MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制.默认情况下是没有开启缓存的,要开启二级缓存,你需要在你的SQL映射文件中添加一行: <cache/> 字面上看就是这样.这个简单语句的效果如下: 1.映射语句文件中的所有select语句将会被缓存. 2.映射语句文件中的所有insert,update和delete语句会刷新缓存. 3.缓存会使用Least Recently Used(LRU,最近最少使用的)算法来收回. 4.根据时间表(比如 no Flush Inter

  • MyBatis框架之mybatis逆向工程自动生成代码

    Mybatis属于半自动ORM,在使用这个框架中,工作量最大的就是书写Mapping的映射文件,由于手动书写很容易出错,我们可以利用Mybatis-Generator来帮我们自动生成文件. 逆向工程 1.什么是逆向工程 mybaits需要程序员自己编写sql语句,mybatis官方提供逆向工程 可以针对单表自动生成mybatis执行所需要的代码(mapper.java,mapper.xml.po..) 企业实际开发中,常用的逆向工程方式: 由于数据库的表生成java代码. 2.下载逆向工程 my

  • Java下Struts框架中的ActionForm类详解

    ActionForm的应用 (1) .创建一个form类必须继承四个父类中的一个.比如继承ActionForm. (2) .一个form类中的每一个属性都将和页面中form 表单中的每一个元素一一对应 例如. 一个表单为: <form> <input type="text" name="username"></input> <input type="password" name="passwor

  • 浅谈springboot中tk.mapper代码生成器的用法说明

    问:什么是tk.mapper? 答:这是一个通用的mapper框架,相当于把mybatis的常用数据库操作方法封装了一下,它实现了jpa的规范,简单的查询更新和插入操作都可以直接使用其自带的方法,无需写额外的代码. 而且它还有根据实体的不为空的字段插入和更新的方法,这个是非常好用的哈. 而且它的集成非常简单和方便,下面我来演示下使用它怎么自动生成代码. pom中引入依赖,这里引入tk.mybatis.mapper的版本依赖是因为在mapper-spring-boot-starter的新版本中没有

  • thinkPHP5框架中widget的功能与用法详解

    本文实例讲述了thinkPHP5框架中widget的功能与用法.分享给大家供大家参考,具体如下: 注意:使用助手函数return view()渲染,则挂件功能会失败,必须使用return $this->fetch() 我们在使用模板的时候,一般网站的顶部(比如说导航栏,或者用户登录区域等等),以及网站的尾部footer(比如友情链接或者版权说明等等),和body区域,我们会为了简化代码,都会将这三个部分剖开分离,然后通过模板继承的方式来使用. 但是如果顶部和尾部只是单纯的html代码还好说,但是

  • python开发实例之Python的Twisted框架中Deferred对象的详细用法与实例

    Deferred对象在Twsited框架中用于处理回调,这对于依靠异步的Twisted来说十分重要,接下来我们就以实例解析Python的Twisted框架中Deferred对象的用法 Deferred对象结构 Deferred由一系列成对的回调链组成,每一对都包含一个用于处理成功的回调(callbacks)和一个用于处理错误的回调(errbacks).初始状态下,deffereds将由两个空回调链组成.在向其中添加回调时将总是成对添加.当异步处理中的结果返回时,Deferred将会启动并以添加时

  • php的lavarel框架中join和orWhere的用法

    Laravel是一个开源PHP框架,功能强大且易于理解.它遵循模型 - 视图 - 控制器设计模式(MVC).Laravel重用了不同框架的现有组件,这有助于创建Web应用程序.这样设计的Web应用程序更加结构化和实用. Laravel框架的主要特点: 1.模块化包装 2.依赖管理器完全基于composer 3.精湛的自动加载器 4.优雅的ORM 5.查询构建器作为潜在的ORM替代 6.PostgreSQL,MySQL,SQL Server平台支持您的数据库 7.简化的叶片模板引擎 8.比以前更快

随机推荐