MyBatis的逆向工程詳細步驟操作

Rainbow-Sea發表於2024-06-15

1. MyBatis的逆向工程詳細步驟操作

@

目錄
  • 1. MyBatis的逆向工程詳細步驟操作
  • 2. 逆向工程配置與生成
    • 2.1 MyBatis3Simple:基礎版,只有基本的增刪改查
      • 2.1.1 第一步:在pom.xml 中新增逆向工程外掛
      • 2.1.2 第二步:配置 generatorConfig.xml
      • 2.1.3 第三步:執行外掛
      • 2.1.4 第四步:測試執行
    • 2.2 MyBatis3:生成的是增強版
  • 3. 總結:
  • 4. 最後:


所謂的逆向工程:會/可以根據資料庫表逆向生成Java的 POJO類,SqlMapper.xml (對應SQL對映檔案),以及Mapper 介面類等。

思考:使用這個外掛的話,需要給這個外掛配置哪些資訊?

  • POJO類名,包名以及要生成的所在位置
  • SqlMapper.xml 檔名以及生成位置
  • Mapper 介面名以及生成位置
  • 連線資料庫的資訊
  • 指定哪些表參與逆向工程
  • ......

關於 MyBatis 的逆向工程有兩個版本: 對應在 targetRuntime 的兩個值:

  1. MyBatis3Simple:生成的是基礎版,只有基本的增刪改查。
  2. MyBatis3:生成的是增強版,除了基本的增刪改查之外還有複雜的增刪改查。

在這裡插入圖片描述

2. 逆向工程配置與生成

在這裡插入圖片描述

下面我們進行逆向工程配置,讓其為我們自動生成va的 POJO類,SqlMapper.xml (對應SQL對映檔案),以及Mapper 介面類等。

2.1 MyBatis3Simple:基礎版,只有基本的增刪改查

2.1.1 第一步:在pom.xml 中新增逆向工程外掛

大家直接複製就好了,不用修改的。

<!--定製構建過程-->
<build>
  <!--可配置多個外掛-->
  <plugins>
    <!--其中的一個外掛:mybatis逆向工程外掛-->
    <plugin>
      <!--外掛的GAV座標-->
      <groupId>org.mybatis.generator</groupId>
      <artifactId>mybatis-generator-maven-plugin</artifactId>
      <version>1.4.1</version>
      <!--允許覆蓋-->
      <configuration>
        <overwrite>true</overwrite>
      </configuration>
      <!--外掛的依賴-->
      <dependencies>
        <!--mysql驅動依賴-->
        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>8.0.30</version>
        </dependency>
      </dependencies>
    </plugin>
  </plugins>
</build>

在這裡插入圖片描述

在這裡插入圖片描述

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.rainbowsea</groupId>
    <artifactId>mybatis-012-generator2</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

    <dependencies>
        <!--        mybatis 的依賴-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.10</version>
        </dependency>

        <!--        mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.30</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>

        <!--        引入 logback的依賴,這個日誌框架實現了slf4j 規範-->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.11</version>
        </dependency>
    </dependencies>

    <!--定製構建過程-->
    <build>
        <!--可配置多個外掛-->
        <plugins>
            <!--其中的一個外掛:mybatis逆向工程外掛-->
            <plugin>
                <!--外掛的GAV座標-->
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.4.1</version>
                <!--允許覆蓋-->
                <configuration>
                    <overwrite>true</overwrite>
                </configuration>
                <!--外掛的依賴-->
                <dependencies>
                    <!--mysql驅動依賴-->
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>8.0.30</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>


</project>

2.1.2 第二步:配置 generatorConfig.xml

注意:該檔案必須配置到類的根路徑下,並且該檔名必須是為 generatorConfig.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>
    <!--
        targetRuntime有兩個值:
            MyBatis3Simple:生成的是基礎版,只有基本的增刪改查。
            MyBatis3:生成的是增強版,除了基本的增刪改查之外還有複雜的增刪改查。
    -->
    <context id="DB2Tables" targetRuntime="MyBatis3Simple">
        <!--防止生成重複程式碼-->
        <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/>
      
        <commentGenerator>
            <!--是否去掉生成日期-->
            <property name="suppressDate" value="true"/>
            <!--是否去除註釋-->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <!--連線資料庫資訊-->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/powernode"
                        userId="root"
                        password="root">
        </jdbcConnection>

        <!-- 生成pojo包名和位置 -->
        <javaModelGenerator targetPackage="com.powernode.mybatis.pojo" targetProject="src/main/java">
            <!--是否開啟子包-->
            <property name="enableSubPackages" value="true"/>
            <!--是否去除欄位名的前後空白-->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!-- 生成SQL對映檔案的包名和位置 -->
        <sqlMapGenerator targetPackage="com.powernode.mybatis.mapper" targetProject="src/main/resources">
            <!--是否開啟子包-->
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>

        <!-- 生成Mapper介面的包名和位置 -->
        <javaClientGenerator
                type="xmlMapper"
                targetPackage="com.powernode.mybatis.mapper"
                targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>

        <!-- 表名和對應的實體類名-->
        <table tableName="t_car" domainObjectName="Car"/>

    </context>
</generatorConfiguration>

在這裡插入圖片描述

下面,我們先使用 MyBatis3Simple:生成的是基礎版,只有基本的增刪改查

在這裡插入圖片描述

注意:需要將其中的一些資訊修改為你自己的比如(資料庫的賬號密碼,以及你所想的包名的路徑名稱等等)

在這裡插入圖片描述

<?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>
    <!--
        targetRuntime有兩個值:
            MyBatis3Simple:生成的是基礎版,只有基本的增刪改查。
            MyBatis3:生成的是增強版,除了基本的增刪改查之外還有複雜的增刪改查。
    -->
    <context id="DB2Tables" targetRuntime="MyBatis3Simple">
        <!--防止生成重複程式碼-->
        <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/>

        <commentGenerator>
            <!--是否去掉生成日期-->
            <property name="suppressDate" value="true"/>
            <!--是否去除註釋-->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <!--連線資料庫資訊-->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/powernode"
                        userId="root"
                        password="MySQL123">
        </jdbcConnection>

        <!-- 生成pojo包名和位置 -->
        <javaModelGenerator targetPackage="com.rainbowsea.mybatis.pojo" targetProject="src/main/java">
            <!--是否開啟子包-->
            <property name="enableSubPackages" value="true"/>
            <!--是否去除欄位名的前後空白-->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!-- 生成SQL對映檔案的包名和位置 -->
        <sqlMapGenerator targetPackage="com.rainbowsea.mybatis.mapper" targetProject="src/main/resources">
            <!--是否開啟子包-->
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>

        <!-- 生成Mapper介面的包名和位置 -->
        <javaClientGenerator
                type="xmlMapper"
                targetPackage="com.rainbowsea.mybatis.mapper"
                targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>

        <!-- 表名和對應的實體類名-->
        <table tableName="t_car" domainObjectName="Car"/>

    </context>
</generatorConfiguration>

2.1.3 第三步:執行外掛

在這裡插入圖片描述

在這裡插入圖片描述

我們可以開啟專案看看。

在這裡插入圖片描述

在這裡插入圖片描述

2.1.4 第四步:測試執行

別忘記了,執行MyBatis 還是需要匯入關於 MyBatis 的相關依賴的 jar 包的

  • 依賴:mybatis依賴、mysql驅動依賴、junit依賴、logback依賴
  • jdbc.properties
  • mybatis-config.xml
  • logback.xml

編寫測試程式:

在這裡插入圖片描述

在這裡插入圖片描述

package com.rainbowsea.mybatis.test;

import com.rainbowsea.mybatis.mapper.CarMapper;
import com.rainbowsea.mybatis.pojo.Car;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;

public class CarMapperTest {


    // CarExample類負責封裝查詢條件的
    @Test
    public void testSelect() throws IOException {
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
        SqlSession sqlSession = sqlSessionFactory.openSession();
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);

        // 執行查詢
        // 1. 查詢一個
        Car car = mapper.selectByPrimaryKey(118L);
        System.out.println(car);

        sqlSession.close();
    }
}

2.2 MyBatis3:生成的是增強版

升級為 MyBatis3 增強版,只需要在 generatorConfig.xml 配置檔案當中的targetRuntime="MyBatis3" 的值,設定為:myBatis3 即可。其它的和上面 MyBatis3Simple 的操作是一樣的。

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

注意:MyBatis3 增強版,多出來的這個 CarExample 實體類物件,是封裝了條件,透過CarExample 物件來封裝查詢條件的

如下執行測試:

在這裡插入圖片描述

package com.rainbowsea.mybatis.test;

import com.rainbowsea.mybatis.mapper.CarMapper;
import com.rainbowsea.mybatis.pojo.Car;
import com.rainbowsea.mybatis.pojo.CarExample;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.math.BigDecimal;
import java.util.List;

public class CarMapperTest {
    @Test
    public void testDeleteByPrimaryKey() throws IOException {
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
        SqlSession sqlSession = sqlSessionFactory.openSession();
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);
        // 執行查詢
        // 1. 查詢一個
        Car car = mapper.selectByPrimaryKey(118L);
        System.out.println(car);

        // 2. 查詢所有(selectByExample 根據條件查詢,如果條件是null表示沒有條件)
        List<Car> cars = mapper.selectByExample(null);
        cars.forEach(car1 -> {
            System.out.println(car1);
        });

        // 3. 按照條件進行查詢
        // 封裝條件,透過CarExample 物件來封裝查詢條件
        CarExample carExample = new CarExample();
        // 呼叫carExample.createCriteria()方法來建立查詢條件
        carExample.createCriteria()
                .andBrandLike("小米")
                .andGuidePriceGreaterThan(new BigDecimal(30.0));
        // 新增 or
        carExample.or().andCarTypeEqualTo("燃油車");

        // 執行查詢
        List<Car> cars2 = mapper.selectByExample(carExample);
        cars2.forEach(car2->{
            System.out.println(car2);
        });


        sqlSession.close();

    }
}

在這裡插入圖片描述

package com.powernode.mybatis.test;

import com.powernode.mybatis.mapper.CarMapper;
import com.powernode.mybatis.pojo.Car;
import com.powernode.mybatis.pojo.CarExample;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.math.BigDecimal;
import java.util.List;

public class GeneratorTest {
    @Test
    public void testGenerator() throws Exception{
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        SqlSession sqlSession = sqlSessionFactory.openSession();
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);
        // 增
        /*Car car = new Car();
        car.setCarNum("1111");
        car.setBrand("比亞迪唐");
        car.setGuidePrice(new BigDecimal(30.0));
        car.setProduceTime("2010-10-12");
        car.setCarType("燃油車");
        int count = mapper.insert(car);
        System.out.println("插入了幾條記錄:" + count);*/
        // 刪
        /*int count = mapper.deleteByPrimaryKey(83L);
        System.out.println("刪除了幾條記錄:" + count);*/
        // 改
        // 根據主鍵修改
        /*Car car = new Car();
        car.setId(89L);
        car.setGuidePrice(new BigDecimal(20.0));
        car.setCarType("新能源");
        int count = mapper.updateByPrimaryKey(car);
        System.out.println("更新了幾條記錄:" + count);*/
        // 根據主鍵選擇性修改
        /*car = new Car();
        car.setId(89L);
        car.setCarNum("3333");
        car.setBrand("寶馬520Li");
        car.setProduceTime("1999-01-10");
        count = mapper.updateByPrimaryKeySelective(car);
        System.out.println("更新了幾條記錄:" + count);*/

        // 查一個
        Car car = mapper.selectByPrimaryKey(89L);
        System.out.println(car);
        // 查所有
        List<Car> cars = mapper.selectByExample(null);
        cars.forEach(c -> System.out.println(c));
        // 多條件查詢
        // QBC 風格:Query By Criteria 一種查詢方式,比較物件導向,看不到sql語句。
        CarExample carExample = new CarExample();
        carExample.createCriteria()
                .andBrandEqualTo("豐田霸道")
                .andGuidePriceGreaterThan(new BigDecimal(60.0));
        carExample.or().andProduceTimeBetween("2000-10-11", "2022-10-11");

        mapper.selectByExample(carExample);
        sqlSession.commit();
    }
}

3. 總結:

  1. 所謂的逆向工程:會/可以根據資料庫表逆向生成Java的 POJO類,SqlMapper.xml (對應SQL對映檔案),以及Mapper 介面類等。
  2. 關於 MyBatis 的逆向工程有兩個版本:對應在 targetRuntime 的兩個值:
1.  MyBatis3Simple:生成的是基礎版,只有基本的增刪改查。
2.  MyBatis3:生成的是增強版,除了基本的增刪改查之外還有複雜的增刪改查。
  1. 注意:MyBatis3 增強版,多出來的這個 CarExample 實體類物件,是封裝了條件,透過CarExample 物件來封裝查詢條件的

4. 最後:

“在這個最後的篇章中,我要表達我對每一位讀者的感激之情。你們的關注和回覆是我創作的動力源泉,我從你們身上吸取了無盡的靈感與勇氣。我會將你們的鼓勵留在心底,繼續在其他的領域奮鬥。感謝你們,我們總會在某個時刻再次相遇。”

在這裡插入圖片描述

相關文章