天天看點

Springboot 整合Mybatis 逆向工程(詳解版)Springboot 整合Mybatis 逆向工程(詳解版)

Springboot 整合Mybatis 逆向工程(詳解版)

什麼逆向工程

分析資料庫中資料表,自動生成JavaBean(與資料庫表對應的實體類)、dao 接口(資料通路層接口,定義了通路資料的方法)、SQLMap (sql 語句映射檔案,與dao層接口類一一對應)

step1:寫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>
<!--    在maven中配置了依賴這個就可以注釋掉了-->
<!--    <classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />-->

    <context id="DB2Tables" targetRuntime="MyBatis3">
<!--資料庫連接配接資訊-->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://10.10.10.10:3306/meeting?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=CTT"
                        userId="root"
                        password="root">
        </jdbcConnection>

        <javaTypeResolver >
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>
<!--JavaBean 實體類-->
        <javaModelGenerator targetPackage="top.crxk.MyBatisGenerator.entity" targetProject="./src/main/java">
            <property name="enableSubPackages" value="false" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
<!--SQL映射檔案-->
        <sqlMapGenerator targetPackage="mapping" targetProject="/Users/crxk/Documents/codeWorld/dhu/Learning/MyBatisGenerator/src/main/resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>
<!--Mapper接口-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="top.crxk.MyBatisGenerator.dao" targetProject="/Users/crxk/Documents/codeWorld/dhu/Learning/MyBatisGenerator/src/main/java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>
<!--配置所要生成代碼的表-->
        <table schema="DB2ADMIN" tableName="task" domainObjectName="Task" >
        </table>

    </context>
</generatorConfiguration>
           

關于一些配置項的解釋:

targetPackage

用于配置生成的代碼要放在哪個包裡面, 這個如果沒有的話Mybatis Generator會自動建立。

targetProject

官方定義是

This is used to specify a target project for the generated objects.

用最直白的語句解釋就是:targetPackage所在的目錄,也就是targetPackage的父目錄。

這個目錄是一定要有的,如果沒有的話Mybatis generator不會自動建立。

這裡的路徑可以寫絕對路徑,也可以寫相對路徑,相對路徑是相對于這個xml配置檔案的!

最坑的一點:

關于為什麼Mybatis generator程式運作成功以後,并沒有代碼檔案生成的問題,是因為:

mac和windows有些不一樣

mac下路徑要這樣寫./src

windows下的路徑是這樣寫.\src

這個是很坑的,mbg不會給出錯誤提示!

step2:運作程式生成代碼

Mybatis Generator官方提供了很多種方式來生成代碼,但最好用最靈活的是直接寫一段Java代碼,讀取配置檔案,來生成目标代碼。

package top.crxk.MyBatisGenerator;

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

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class TestMbg {
    public static void main(String[] args) throws Exception{
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        // 從這裡加載配置檔案,此時要注意路徑
        // 其他的代碼不用動,直接運作即可
        File configFile = new File("mbg.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
    }
}

           

step3:使用目标代碼

Mybatis Generator生成的代碼提供了非常強大的對于單表的 增删改查的操作。

每一個表mbg會生成四個檔案,以task表為例,分别是

  • Task.java
  • TaskExample.java
  • TaskMapper.java
  • TaskMapper.xml

使用TaskExample.java這個類可動态地定義出各種條件查詢子句,滿足對于單個表的各種增删改查的操作,如果不涉及到其他的表,基本上不用和其他檔案打交道了。

舉個例子:

@Controller
@ResponseBody
@RequestMapping("/test")
public class testMbgController {
    @Autowired
    TaskMapper taskMapper;
    @Autowired
    TaskExample taskExample;

    @RequestMapping("/countByExample")
    public long countByExample(int id) {
        taskExample.or().andIdEqualTo(id);
        return taskMapper.countByExample(taskExample);
    }

    @RequestMapping("/selectByExample")
    public List<Task> selectByExample() {
        taskExample.or().andIdEqualTo(12);
        return taskMapper.selectByExample(taskExample);
    }
}
           

相關細節

TaskExample.Criteria
主要就是定義各種查詢條件的,是TaskExample的核心。
           
taskExample.or()
           

調用taskExample的or()方法,會傳回一個Criteria,Criteria定義了與資料表中各個字段相關的方法,調用這些方法來設定條件,可以鍊式調用以添加多個條件。

taskExample.or().andIdEqualTo(12).andDeviceIdIsNull();
           

所包含的條件

  • IS NULL-表示相關列必須為NULL
  • IS NOT NULL-表示相關列不能為NULL
  • =(等于)-表示相關列必須等于方法調用中傳遞的值
  • <>(不等于)-表示相關列不得等于方法調用中傳遞的值
  • >(大于)-表示相關列必須大于方法調用中傳遞的值
  • > =(大于或等于)-表示相關列必須大于或等于在方法調用中傳遞的值
  • <(小于)-表示相關列必須小于方法調用中傳遞的值
  • <=(小于或等于)-表示相關列必須小于或等于在方法調用中傳遞的值
  • LIKE-表示相關列必須與方法調用中傳遞的值“相似”。 該代碼未添加必需的’%’,您必須在方法調用中傳遞的值中自行設定該值。
  • 不喜歡-意味着相關列必須“不喜歡”方法調用中傳遞的值。 該代碼未添加必需的’%’,您必須在方法調用中傳遞的值中自行設定該值。
  • BETWEEN-表示相關列必須在方法調用中傳遞的兩個值之間。
  • NOT BETWEEN-表示相關列必須在方法調用中傳遞的兩個值之間“不在”之間。
  • IN-表示相關列必須是方法調用中傳入的值清單之一。
  • NOT IN-表示相關列不得為方法調用中傳遞的值清單之一。

示例代碼

https://download.csdn.net/download/crxk_/11907671