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.1.1 第一步:在
- 2.2 MyBatis3:生成的是增強版
- 2.1 MyBatis3Simple:基礎版,只有基本的增刪改查
- 3. 總結:
- 4. 最後:
所謂的逆向工程:會/可以根據資料庫表逆向生成Java的 POJO類,SqlMapper.xml (對應SQL對映檔案),以及Mapper 介面類等。
思考:使用這個外掛的話,需要給這個外掛配置哪些資訊?
- POJO類名,包名以及要生成的所在位置
- SqlMapper.xml 檔名以及生成位置
- Mapper 介面名以及生成位置
- 連線資料庫的資訊
- 指定哪些表參與逆向工程
- ......
關於 MyBatis 的逆向工程有兩個版本: 對應在 targetRuntime 的兩個值:
- MyBatis3Simple:生成的是基礎版,只有基本的增刪改查。
- 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. 總結:
- 所謂的逆向工程:會/可以根據資料庫表逆向生成Java的 POJO類,SqlMapper.xml (對應SQL對映檔案),以及Mapper 介面類等。
- 關於 MyBatis 的逆向工程有兩個版本:對應在 targetRuntime 的兩個值:
1. MyBatis3Simple:生成的是基礎版,只有基本的增刪改查。 2. MyBatis3:生成的是增強版,除了基本的增刪改查之外還有複雜的增刪改查。
- 注意:MyBatis3 增強版,多出來的這個
CarExample
實體類物件,是封裝了條件,透過CarExample 物件來封裝查詢條件的
4. 最後:
“在這個最後的篇章中,我要表達我對每一位讀者的感激之情。你們的關注和回覆是我創作的動力源泉,我從你們身上吸取了無盡的靈感與勇氣。我會將你們的鼓勵留在心底,繼續在其他的領域奮鬥。感謝你們,我們總會在某個時刻再次相遇。”