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-表示相關列不得爲方法調用中傳遞的值列表之一。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章