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

打印 上一主题 下一主题

主题 884|帖子 884|积分 2652

文章目录



  • 前言
  • 一、Mybatis Generator简介
  • 二、Maven插件运行方式
  • 三、生成配置 generatorConfig.xml


    • MyBatis3Simple风格
    • MyBatis3风格
    • MyBatis3DynamicSql风格

  • 四、Java代码运行方式
  • 五、MGB生成全部表
  • 六、增加Ext包
  • 七、Git提交
  • 总结

前言

本文我们重要实战Mybatis官方的代码生成器:Mybatis Generator(MBG),把握它以后,可以简化大部门手写代码,我们只需要写复杂逻辑代码!
   通过前几篇,我们把握了在SpringBoot下Mybatis的基本用法,操纵步骤回首一下:
  

  • 创建与MySQL表对应的Java PO对象,字段一一对应;
  • 创建Mapper接口,和对应的XML映射文件(或注解)。
   在实际开辟中,你会发现有很多重复的工作:
  

  • 起首是PO对象,我们往往创建与数据库表字段一一对应的PO对象;
  • 其次在Mapper里,通常都会写基本的增删改查代码。
   重复不符合我们程序员的风格:
  

  • 实在对于PO对象,只需要读取数据库表字段,然后做SQL列类型与Java字段类型转换,再将列名转成骆驼命名就可以实现,以是能实现的代码生成器也非常多!
  • 再者对于单表的基本增删改查是ORM的基本功能,像JPA对单表的基本增删改查都进行了封装!
    那么在Mybatis里,这些当然也不在话下,Mybatis官方为我们提供了非常好用的代码生成器:Mybatis Generator (MBG) 。
   本文就带大家实战一下Mybatis Generator,用它生成实战项目全部表的PO对象和基本增删改查代码!
  
一、Mybatis Generator简介

Mybatis Generator(MBG)是Mybatis官方提供的一个代码生成工具,它可以根据数据库表自动生成对应的Java Model、Mapper和XML文件,乃至还可以生成一些高级查询功能,利用Mybatis-Generator可以大大低落开辟者的工作量,进步开辟效率!
   支持利用Maven插件生成,也支持编写Java代码生成,还有命令行等等多种方式!
支持生成XML映射文件风格的代码,也支持生成全注解风格的代码!
  
二、Maven插件运行方式

起首在工程tg-book-dal的pom.xml中,根节点project下添加build节点,如下:
  1. <build>
  2.     <resources>
  3.         <resource>
  4.             <directory>src/main/resources</directory>
  5.             <filtering>true</filtering>
  6.         </resource>
  7.     </resources>
  8.     <plugins>
  9.         <plugin>
  10.             <groupId>org.mybatis.generator</groupId>
  11.             <artifactId>mybatis-generator-maven-plugin</artifactId>
  12.             <version>1.3.7</version>
  13.             <configuration>
  14.                 <verbose>true</verbose>
  15.                 <overwrite>true</overwrite>
  16.             </configuration>
  17.             <dependencies>
  18.                 <dependency>
  19.                     <groupId>mysql</groupId>
  20.                     <artifactId>mysql-connector-java</artifactId>
  21.                     <version>8.0.21</version>
  22.                 </dependency>
  23.             </dependencies>
  24.         </plugin>
  25.     </plugins>
  26. </build>
复制代码
然后革新tg-book-dal的Maven依赖,你就能看到mybatis-generator插件了,如下图:

   注意,这时生成时会报错,因为我们还需要添加配置文件,接着向下看.
  
三、生成配置 generatorConfig.xml

在tg-book-dal 的 src/main/resources 下 添加配置文件: generatorConfig.xml ,用于配置生成风格,数据库毗连、生成代码包路径、生成哪些表等等,各配置参数详解参考注释:
注意:==我增加了几个实用的可选配置,像生成时覆盖原文件、去除注释、自增主键列、columnOverride ==
  1. <!DOCTYPE generatorConfiguration PUBLIC
  2.         "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  3.         "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
  4. <generatorConfiguration>
  5.     <!-- MyBatis3Simple风格 -->
  6.     <context id="simple" targetRuntime="MyBatis3Simple">
  7.         <property name="javaFileEncoding" value="UTF-8"/>
  8.         <!--生成mapper.xml时覆盖原文件-->
  9.         <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/>
  10.         <commentGenerator>
  11.             <!-- 是否去除自动生成的注释 true:是 : false:否。 自动生成注释太啰嗦,可以编码扩展CommentGenerator -->
  12.             <property name="suppressAllComments" value="true"/>
  13.         </commentGenerator>
  14.         <!-- 数据库连接 -->
  15.         <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
  16.                         connectionURL="jdbc:mysql://localhost:3306/db_book?useUnicode=true&amp;characterEncoding=utf8&amp;tinyInt1isBit=true&amp;serverTimezone=UTC"
  17.                         userId="root" password="root">
  18.             <!-- 设置为true就只读取db_book下的表, 否则会优先读取到mysql的user表  -->
  19.             <property name="nullCatalogMeansCurrent" value="true"/>
  20.         </jdbcConnection>
  21.         <!-- 生成PO的包名和位置 -->
  22.         <javaModelGenerator targetPackage="org.tg.book.dal.po.mbg" targetProject="src/main/java"/>
  23.         <!-- 生成XML映射文件的包名和位置 -->
  24.         <sqlMapGenerator targetPackage="org.tg.book.dal.mapper.mbg" targetProject="src/main/resources"/>
  25.         <!-- 生成Mapper接口的包名和位置 -->
  26.         <javaClientGenerator type="XMLMAPPER" targetPackage="org.tg.book.dal.mapper.mbg" targetProject="src/main/java"/>
  27.         <!-- 要生成对应表配置 -->
  28.         <table tableName="user" domainObjectName="User" >
  29.             <!-- 自增主键列 -->
  30.             <generatedKey column="id" sqlStatement="MYSQL" identity="true"/>
  31.             <!-- tinyint映射为Integer -->
  32.             <columnOverride column="role" javaType="Integer" jdbcType="TINYINT"/>
  33.         </table>
  34.     </context>
  35. </generatorConfiguration>
复制代码
MyBatis3Simple风格

上面配置的是MyBatis3Simple风格,只配置了一个表:user,双击插件的mybatis-generator:generate以后,生成的代码如下:

MyBatis3Simple风格生成的代码比力精简,看一看UserMapper的接口方法,只有基本的增删改查方法:
  1. public interface UserMapper {
  2.     int deleteByPrimaryKey(Integer id);
  3.     int insert(User record);
  4.     User selectByPrimaryKey(Integer id);
  5.     List<User> selectAll();
  6.     int updateByPrimaryKey(User record);
  7. }
复制代码
MyBatis3风格

我们再看看MyBatis3风格,只需要将 targetRuntime=“MyBatis3Simple” 修改为 targetRuntime=“MyBatis3”,然后再双击插件的mybatis-generator:generate,就可以看到增加了 “by example” 和 “selective” 方法



  • selective方法:选择性插入或更新,判断PO字段不为空才插入或修改。在只需要插入或修改个别字段值时利用,对应生成的SQL不包括=null的字段,但同样也需要注意,你无法用它将字段设置为null。 ??
  • by example方法:这个东西有点小强大,可以动态生成各种查询条件,在后面的接口开辟实战中我们再利用。但就是生成的代码有点多,没有实现example代码的复用。对于单表复杂查询喜好直接SQL的,可以禁用生成example,可以通过table节点的如下配置来指定是否启用。
属性
阐明
enableSelectByExample
是否启用生成selectByExample
enableDeleteByExample
是否启用生成deleteByExample
enableCountByExample
是否启用生成countByExample
enableUpdateByExample
是否启用生成updateByExample和updateByExampleSelective
MyBatis3DynamicSql风格

只需要将 targetRuntime=“MyBatis3” 修改为 targetRuntime=“MyBatis3DynamicSql”。
生成的代码是全注解风格的,也就不会生成UserMapper.xml和UserExample类,而是新生成了UserDynamicSqlSupport类。
需要增加mybatis-dynamic-sql依赖包:
  1. <!--mybatis-dynamic-sql-->
  2. <dependency>
  3.     <groupId>org.mybatis.dynamic-sql</groupId>
  4.     <artifactId>mybatis-dynamic-sql</artifactId>
  5.     <version>1.1.4</version>
  6. </dependency>
复制代码

四、Java代码运行方式

除了利用插件运行方式来生成,我们还可以以Java代码方式运行,添加mybatis-generator-core依赖包,如下:
  1. <dependency>
  2.     <groupId>org.mybatis.generator</groupId>
  3.     <artifactId>mybatis-generator-core</artifactId>
  4.     <version>1.3.7</version>
  5. </dependency>
复制代码
添加main方法,如下:
  1. package org.tg.book.dal;
  2. import org.mybatis.generator.api.MyBatisGenerator;
  3. import org.mybatis.generator.config.Configuration;
  4. import org.mybatis.generator.config.xml.ConfigurationParser;
  5. import org.mybatis.generator.exception.InvalidConfigurationException;
  6. import org.mybatis.generator.exception.XMLParserException;
  7. import org.mybatis.generator.internal.DefaultShellCallback;
  8. import java.io.File;
  9. import java.io.IOException;
  10. import java.sql.SQLException;
  11. import java.util.ArrayList;
  12. import java.util.List;
  13. public class MybatisGeneratorRunner {
  14.     public static void main(String[] args) throws XMLParserException, IOException, InvalidConfigurationException, SQLException, InterruptedException {
  15.         List<String> warnings = new ArrayList<String>();
  16.         boolean overwrite = true;
  17.         // 使用xml配置文件的方式
  18.         File configFile = new File(MybatisGeneratorRunner.class.getClassLoader().getResource("generatorConfig.xml").getPath());
  19.         ConfigurationParser cp = new ConfigurationParser(warnings);
  20.         Configuration config = cp.parseConfiguration(configFile);
  21.         // 使用纯Java代码配置的方式, 相当于把 generatorConfig.xml配置的都用java代码配置到config中
  22.         // config = new Configuration();
  23.         DefaultShellCallback callback = new DefaultShellCallback(overwrite);
  24.         MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
  25.         myBatisGenerator.generate(null);
  26.         System.out.println(warnings);
  27.     }
  28. }
复制代码
  注意:我实行后生成到父项目下了??,需要修改generatorConfig.xml 将targetProject加上项目名称,如下:
  1. <!-- 生成PO的包名和位置 -->
  2. <javaModelGenerator targetPackage="org.tg.book.dal.po.mbg" targetProject="tg-book-dal/src/main/java"/>
  3. <!-- 生成XML映射文件的包名和位置 -->
  4. <sqlMapGenerator targetPackage="org.tg.book.dal.mapper.mbg" targetProject="tg-book-dal/src/main/resources"/>
  5. <!-- 生成Mapper接口的包名和位置 -->
  6. <javaClientGenerator type="XMLMAPPER" targetPackage="org.tg.book.dal.mapper.mbg" targetProject="tg-book-dal/src/main/java"/>
复制代码
  targetProject加上tg-book-dal以后用插件生成,又提示目录找不到,汗(⊙﹏⊙)b
  1. [WARNING] The specified target project directory tg-book-dal/src/main/resources does not exist
  2. [WARNING] The specified target project directory tg-book-dal/src/main/java does not exist
  3. [WARNING] The specified target project directory tg-book-dal/src/main/java does not exist
  4. [WARNING] The specified target project directory tg-book-dal/src/main/java does not exist
复制代码

五、MGB生成全部表

一共8张表,重要注意点:


  • generatedKey:配置自增id
  • columnOverride:指定tinyint列映射到Java类型是Integer还是Boolean
   除了user的另外7张表配置:
  1. <table tableName="book" domainObjectName="Book" >
  2.     <generatedKey column="id" sqlStatement="MYSQL" identity="true"/>
  3.     <columnOverride column="status" javaType="Integer" jdbcType="TINYINT"/>
  4.     <columnOverride column="is_recommend" javaType="Boolean" jdbcType="TINYINT"/>
  5. </table>
  6. <table tableName="book_borrowing" domainObjectName="BookBorrowing" >
  7.     <generatedKey column="id" sqlStatement="MYSQL" identity="true"/>
  8.     <columnOverride column="status" javaType="Integer" jdbcType="TINYINT"/>
  9. </table>
  10. <table tableName="book_comment" domainObjectName="BookComment" >
  11.     <generatedKey column="id" sqlStatement="MYSQL" identity="true"/>
  12.     <columnOverride column="score" javaType="Integer" jdbcType="TINYINT"/>
  13. </table>
  14. <table tableName="book_favorite" domainObjectName="BookFavorite" >
  15.     <generatedKey column="id" sqlStatement="MYSQL" identity="true"/>
  16.     <columnOverride column="is_cancelled" javaType="Boolean" jdbcType="TINYINT"/>
  17. </table>
  18. <table tableName="notice" domainObjectName="Notice" >
  19.     <generatedKey column="id" sqlStatement="MYSQL" identity="true"/>
  20.     <columnOverride column="is_deleted" javaType="Boolean" jdbcType="TINYINT"/>
  21. </table>
  22. <table tableName="qualification" domainObjectName="Qualification" >
  23.     <generatedKey column="id" sqlStatement="MYSQL" identity="true"/>
  24.     <columnOverride column="status" javaType="Integer" jdbcType="TINYINT"/>
  25. </table>
  26. <table tableName="student" domainObjectName="Student" >
  27.     <generatedKey column="id" sqlStatement="MYSQL" identity="true"/>
  28.     <columnOverride column="is_approved" javaType="Boolean" jdbcType="TINYINT"/>
  29.     <columnOverride column="is_frozen" javaType="Boolean" jdbcType="TINYINT"/>
  30. </table>
复制代码

六、增加Ext包

mbg包的代码我们不做任何修改,为了便于区分,我们将自定义的PO和Mapper单独放到ext包下,命名以Ext结尾。


  • 原来的UserMapper修改为UserMapperExt
  • 删除原来的BookMapper和BookMapperImpl,用MBG生成的BookMapper更换,原来引用的关联代码都修改一下
  • 删除原来的PO对象:User和Book,用MBG生成的User和Book更换,原来引用的关联代码都修改一下
  • AuthServiceImpl、BookServiceImpl、UserServiceImpl都有修改的点
终极结构dal的 mapper和po包,如下:

终极的mapper XML映射文件,如下:


七、Git提交

养成好习惯,一步一提交!


总结

本文重要先容了Mybatis Generator (MBG)生成代码的2种生成方式(当然还支持其它方式):

  • Maven插件方式
  • Java代码方式
以及generatorConfig.xml配置的3种生成风格

  • MyBatis3Simple风格
  • MyBatis3风格
  • MyBatis3DynamicSql风格

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

干翻全岛蛙蛙

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表