springboot 集成GMB 和tk.mybatis生成工具

基於我分享的springboot集成GMB(mybatis代碼生成工具)後,再次加入tk.mybatis生成通用mapper,按需生成xml文件。在實際項目開發中,我們經常會遇到添加字段的情況,一旦增加一個字段,我們就需要重新生成相關代碼文件,就需要對比當前生成的和前期寫的代碼,比較麻;用了tk.mybatis生成通用的mapper代碼文件,和基本的xml文件,當再次修改表字段時候,由於以前xml的方法都對應到了通用的mapper接口中,我們只需要修改生成的表對應的實體類,反而mapper通用接口中還有更多的方法供使用,另外這樣生成的entity實體類可以更好的適應spring data jpa(都需要加註解,且類似)

1.項目結構

2.pom.xml加入依賴

<!-- mybatis 生成工具依賴 -->
<dependency>
   <groupId>org.mybatis.generator</groupId>
   <artifactId>mybatis-generator-core</artifactId>
   <version>1.3.5</version>
</dependency>
<!-- tk.mybatis 插件依賴-->
<dependency>
   <groupId>tk.mybatis</groupId>
   <artifactId>mapper</artifactId>
   <version>3.5.2</version>
</dependency>
<dependency>
   <groupId>tk.mybatis</groupId>
   <artifactId>mapper-spring-boot-starter</artifactId>
   <version>2.0.3</version>
</dependency>
<!-- 插件配置-->
<plugins>
   <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
   </plugin>
   <!-- mybatis generator自動生成代碼 -->
   <plugin>
      <groupId>org.mybatis.generator</groupId>
      <artifactId>mybatis-generator-maven-plugin</artifactId>
      <version>1.3.5</version>
      <!-- 此處的依賴在當你使用mybatis工具類(main方法)啓動的時候,不需要添加;
       當你使用idea中的右側插件啓動的時候,則需要添加-->
      <dependencies>
         <dependency>
            <groupId> mysql</groupId>
            <artifactId> mysql-connector-java</artifactId>
            <version>5.1.39</version>
         </dependency>
         <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.5</version>
         </dependency>
         <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper</artifactId>
            <version>3.5.2</version>
         </dependency>
      </dependencies>
      <executions>
         <execution>
            <id>Generate MyBatis Artifacts</id>
            <phase>package</phase>
            <goals>
               <goal>generate</goal>
            </goals>
         </execution>
      </executions>
      <configuration>
         <!--允許移動生成的文件 -->
         <verbose>true</verbose>
         <!-- 是否覆蓋 -->
         <overwrite>true</overwrite>
         <!-- 自動生成的配置 -->
         <configurationFile>
            src/main/resources/generatorConfig.xml</configurationFile>
      </configuration>
   </plugin>
</plugins>

3.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>

    <context id="Tables" targetRuntime="MyBatis3">
        <!-- 使用tk.mybatis插件 -->
        <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
            <property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
            <!-- caseSensitive默認false,當數據庫表名區分大小寫時,可以將該屬性設置爲true -->
            <property name="caseSensitive" value="true"/>
        </plugin>

        <!--數據庫連接 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://10.10.10.10:3306/Test?useSSL=false" userId="root"
                        password="root">
        </jdbcConnection>
        <!--默認false Java type resolver will always use java.math.BigDecimal if
            the database column is of type DECIMAL or NUMERIC. -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <!--生成實體類 指定包名 以及生成的地址 (可以自定義地址,但是路徑不存在不會自動創建 使用Maven生成在target目錄下,會自動創建) -->
        <javaModelGenerator targetPackage="com.example.entity.test"
                            targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
            <property name="constructorBased" value="false" />
            <property name="immutable" value="false" />
        </javaModelGenerator>

        <!--生成SQLMAP文件 -->
        <sqlMapGenerator targetPackage="mappers.test"
                         targetProject="src/main/resources">
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>

        <!--生成Dao文件 可以配置 type="XMLMAPPER"生成xml的dao實現 context id="DB2Tables" 修改targetRuntime="MyBatis3" -->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.example.dao.test"
                             targetProject="src/main/java">
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>

        <!--對應數據庫表 mysql可以加入主鍵自增 字段命名 忽略某字段等 -->
        <!-- XXByExample false 控制實體類,如menuExample輔助類的生成 -->
        <table tableName="dim_menu" enableCountByExample="false"
               enableUpdateByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" selectByExampleQueryId="false" >
            <property name="useActualColumnNames" value="false" />
            <!-- 需要插入時返回主鍵值,請將此屬性打開,column值爲主鍵的列明 -->
            <generatedKey column="id" sqlStatement="MySql" identity="true" />
        </table>

    </context>
</generatorConfiguration>


4.配置啓動類

這裏說一下,如果你在pom.xml文件中的插件中配置依賴(詳細見上面的依賴配置),可以直接點擊idea右側的插件,直接運行;我這裏配置的啓動類指的是使用運行main方法的方式來生成。
package com.example.config;

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;


public class MyBatisGeneratorUtil {
    public static void main(String[] args) {
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        String genCfg = "/generatorConfig.xml";
        File configFile = new File(MyBatisGeneratorUtil.class.getResource(genCfg).getFile());
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = null;
        try {
            config = cp.parseConfiguration(configFile);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XMLParserException e) {
            e.printStackTrace();
        }
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = null;
        try {
            myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        } catch (InvalidConfigurationException e) {
            e.printStackTrace();
        }
        try {
            myBatisGenerator.generate(null);
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

5.運行生成後的文件,也解釋一下

entity類中:可以把字段註釋也帶出來,另外一個重要的就是生成的會有註解,那麼使用過spring data jpa 的朋友就知道了,我們也是需要自己把數據庫表的對應關係按照這樣來做註解,所以如果你也集成了jpa,那麼就又少了一點事。

@Table(name = "dim_menu")
public class DimMenu {
    /**
     * id
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    /**
     * 菜單名稱
     */
    private String name;
}
xml文件:這裏生成的xml文件就不會像MBG生成的那樣多內容,實現的方法都在mapper接口當中了,所以當我們xml裏面寫了自己的sql方法,增加字段也不需要重新生成了。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.dao.test.DimMenuMapper">
  <resultMap id="BaseResultMap" type="com.example.entity.test.DimMenu">
    <!--
      WARNING - @mbg.generated
    -->
    <id column="id" jdbcType="INTEGER" property="id" />
    <result column="name" jdbcType="VARCHAR" property="name" />
  </resultMap>

</mapper>

mapper接口:這裏面集成了通用的mapper,採用反射等可以實現以前通過MBG生成的接口了

package com.example.dao.mapper.test;

import com.example.entity.test.DimMenu ;
import tk.mybatis.mapper.common.Mapper;

public interface DimMenuMapper extends Mapper<DimMenu> {

}

6.小結一下

這些做完了,實際上你還不能正常的運行項目,會報錯,報錯一般都是指的生成的mapper接口不能被注入或者是沒有被注入,所以這裏還需要把生成的類交給spring容器來管理。這裏我也遇到過大坑,都是網上查詢的結果,處理方法如下

啓動類DemoApplication加入註解

@SpringBootApplication
@MapperScan(basePackages = {"com.example.dao.mapper"})
@ComponentScan(basePackages = {"com.example.dao.mapper"})
public class DemoApplication {

   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }
}

或者在mapper類上加上@Mapper註解。

但是博主是測試過程中,方法一不起作用,方法二加了之後,但是還需要屏蔽pom.xml的mapper依賴才能正常運行。具體還沒有完全找到原因。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章