• MyBatis自学(3):MyBatis逆向工程


      什么是Mybatis逆向工程?

      可以针对单表自动生成MyBatis执行所需要的代码,包括:Mapper.java,Mapper.xml,实体类。

      为什么要使用Mybatis逆向工程?

      我们之前说过MyBatis是一个"半自动"的ORM框架,SQL语句需要开发者自定义,这样做的好处是代码更加灵活,缺点是如果参与业务的表太多,每张表的业务都需要自定义SQL,创建实体类,DAO接口,难免会很麻烦。所以我们需要使用逆向工程,让MyBatis自动生成表对应的各种资源,大大减少我们的工作量。

      Mybatis逆向工程有什么不足?

      逆向工程有它自身的局限性,逆向工程方法只能执行一次,如果再次执行就会重复生成对应的DAO接口,实体类等资源。如果需要对表结构进行修改,那么就必须删除已经生成的所有资源,重新生成一次。

      如何使用Mybatis逆向工程?

      MyBatis Generator,简称MBG:是一个专门为MyBatis框架开发者定制的代码生成器,可以根据表结构快速生成对应的Mapper.xml,Mapper接口以及实体类。支持基本的CRUD(Create,Read,Update,Delete),但是复杂的SQL语句需要开发者手动编写。

      1. 添加依赖jar包到pom.xml文件。

    1 <dependency>  
    2       <groupId>org.mybatis.generator</groupId>  
    3       <artifactId>mybatis-generator-core</artifactId>  
    4       <version>1.3.2</version>  
    5 </dependency>

      2. 创建MBG配置文件generatorConfig.xml:

        (1) jdbcConnection配置数据库连接信息。

        (2) javaModelGenerator配置javaBean的生成策略。

        (3) sqlMapGenerator 配置sql映射文件生成策略。

        (4) javaClientGenerator配置Mapper接口的生成策略。

        (5) table配置要逆向解析的数据表(tableName:表名,domainObjectName:对应的javaBean名)。

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE generatorConfiguration
     3   PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
     4   "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
     5 
     6 <generatorConfiguration>
     7     <context id="testTables" targetRuntime="MyBatis3">
     8 
     9         <commentGenerator>
    10             <!-- 删除自动生成注释 -->
    11             <property name="suppressAllComments" value="true" />
    12         </commentGenerator>
    13 
    14         <!-- 配置数据库连接信息 -->
    15         <jdbcConnection 
    16             driverClass="com.mysql.jdbc.Driver"
    17             connectionURL="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=UTF-8" 
    18             userId="root"
    19             password="root">
    20         </jdbcConnection>
    21 
    22         <!-- 数据类型解析,false表示将DECIMAL和 NUMERIC类型解析为 Integer,true表示解析为java.math.BigDecimal -->
    23         <javaTypeResolver>
    24             <property name="forceBigDecimals" value="false" />
    25         </javaTypeResolver>
    26 
    27         <!-- 自动生成实体类存放的位置 -->
    28         <javaModelGenerator targetPackage="com.southwind.entity"
    29             targetProject="./src/main/java">
    30             <!-- enableSubPackages:是否让schema作为包的后缀 -->
    31             <property name="enableSubPackages" value="false" />
    32             <!-- 从数据库返回的值被清理前后的空格 -->
    33             <property name="trimStrings" value="true" />
    34         </javaModelGenerator>
    35 
    36         <!-- 自动生成Mapper.xml存放的位置 -->
    37         <sqlMapGenerator targetPackage="com.southwind.dao" 
    38             targetProject="./src/main/resources">
    39             <!-- enableSubPackages:是否让schema作为包的后缀 -->
    40             <property name="enableSubPackages" value="false" />
    41         </sqlMapGenerator>
    42 
    43         <!-- 自动生成Mapper接口存放的位置 -->
    44         <javaClientGenerator type="XMLMAPPER"
    45             targetPackage="com.southwind.dao" 
    46             targetProject="./src/main/java">
    47             <!-- enableSubPackages:是否让schema作为包的后缀 -->
    48             <property name="enableSubPackages" value="false" />
    49         </javaClientGenerator>
    50 
    51         <!-- 指定数据库表 -->
    52         <table tableName="t_user" domainObjectName="User"></table>    
    53 
    54     </context>
    55 </generatorConfiguration>

      3. 创建GeneratorMain类,执行自动生成资源的代码。

     1 public class GeneratorMain {
     2 
     3     public static void main(String[] args) throws Exception {
     4         List<String> warnings = new ArrayList<String>();
     5         boolean overwrite = true;
     6         String genCfg = "/generatorConfig.xml";
     7         File configFile = new File(GeneratorMain.class.getResource(genCfg).getFile());
     8         ConfigurationParser cp = new ConfigurationParser(warnings);
     9         Configuration config = null;
    10         try {
    11             config = cp.parseConfiguration(configFile);
    12         } catch (IOException e) {
    13             e.printStackTrace();
    14         } catch (XMLParserException e) {
    15             e.printStackTrace();
    16         }
    17         DefaultShellCallback callback = new DefaultShellCallback(overwrite);
    18         MyBatisGenerator myBatisGenerator = null;
    19         try {
    20             myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
    21         } catch (InvalidConfigurationException e) {
    22             e.printStackTrace();
    23         }
    24         try {
    25             myBatisGenerator.generate(null);
    26         } catch (SQLException e) {
    27             e.printStackTrace();
    28         } catch (IOException e) {
    29             e.printStackTrace();
    30         } catch (InterruptedException e) {
    31             e.printStackTrace();
    32         }
    33 
    34     }
    35 
    36 }

      运行逆向工程代码之前,工程目录结构是这样的。

      

      运行GeneratorMain类的main方法,结构如下。

      

      红框标注的部分为自动生成的资源,包括实体类,Mapper接口以及Mapper.xml,使用逆向工程自动生成代码测试成功。

  • 相关阅读:
    http参数传递方式
    Api接口管理工具推荐
    IntelliJ IDEA 插件推荐
    spring服务器接收参数格式
    SSM框架的常用注解整理
    Java map 详解
    遍历Map集合四中方法
    bean对应mapper.xml字段
    Java简历与面试
    SQL的case when then else end语句的用法
  • 原文地址:https://www.cnblogs.com/yaokaizhi/p/9560437.html
Copyright © 2020-2023  润新知