Mybatis-plus+通用mapper(tk.mybatis)的使用
01 引言
常規(guī)的MyBatis操作MySQL步驟
1>創(chuàng)建數(shù)據(jù)庫(kù),創(chuàng)建表
2>創(chuàng)建項(xiàng)目,導(dǎo)入逆向工程相對(duì)應(yīng)的依賴與配置
3>逆向工程創(chuàng)建實(shí)體/mapper接口/mapper.xml映射文件
4>導(dǎo)入mybatis依賴,mysql依賴
5>編寫測(cè)試類,測(cè)試mapper接口實(shí)現(xiàn)CRUD操作
問題:復(fù)雜項(xiàng)目Mybatis太過冗余。項(xiàng)目中,每張表對(duì)應(yīng)一個(gè)實(shí)體類,對(duì)應(yīng)一個(gè)mapper.java接口,也對(duì)應(yīng)一個(gè)mapper.xml配置文件。每個(gè)mapper,java接口都有重復(fù)的增、刪、改、查4個(gè)基礎(chǔ)方法,每一個(gè)Mapper.xml都有重復(fù)的增、刪、改、查4個(gè)基礎(chǔ)sql語句。使用逆向工程可以解決,但是存在很致命的問題,如果列發(fā)生變動(dòng),對(duì)應(yīng)的sql改動(dòng)那就是災(zāi)難啦。另外,如果一個(gè)項(xiàng)目很復(fù)雜,那這些文件就膨脹起來,對(duì)項(xiàng)目的加載與維護(hù)帶來很大挑戰(zhàn)。此時(shí)不禁想,有沒有某種方法可以不寫crud方法,不寫crud sql語句也能完成crud操作呢?

1)MyBatis與MyBatis-Plus區(qū)別
MyBatis:
優(yōu)點(diǎn):
- 1>SQL語句自由控制,較為靈活
- 2>SQL與業(yè)務(wù)代碼分離,易于閱讀與維護(hù)
- 3>提供動(dòng)態(tài)SQL語句,可以根據(jù)需求靈活控制
缺點(diǎn):
- 1>簡(jiǎn)單的crud操作也必須提供對(duì)應(yīng)SQL語句
- 2>必須維護(hù)大量的xml文件
- 3>自身功能有限,要拓展只能依賴第三方插件
MyBatis-Plus 是在Mybatis的基礎(chǔ)上進(jìn)行二次開發(fā)的具有MyBatis所有功能,也添加了不少好用的功能。
比如 :
- 1>提供無sql的crud操作
- 2>內(nèi)置代碼生成器,分頁插件 ,性能分析插件等
- 3>提供功能豐富的條件構(gòu)造器快速進(jìn)行無sql開發(fā)
- 4>提供統(tǒng)一全局處理比如: 樂觀鎖、邏輯刪除等
2)Mybatis-plus入門案例
案例一:spring容器版本的案例

1> sql導(dǎo)入:
CREATE TABLE `employee` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `password` varchar(255) DEFAULT NULL, `email` varchar(255) DEFAULT NULL, `age` int(11) DEFAULT NULL, `admin` bit(1) DEFAULT NULL, `dept_id` bigint(20) DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
INSERT INTO `employee` VALUES (1, 'admin', '1', 'admin@abc.com', 40, b'1', 6); INSERT INTO `employee` VALUES (2, '趙總', '1', 'zhaoz@langfeiyes.com', 35, b'0', 1); INSERT INTO `employee` VALUES (3, '趙一明', '1', 'zhaoym@langfeiyes.com', 25, b'0', 1); INSERT INTO `employee` VALUES (4, '錢總', '1', 'qianz@langfeiyes.com', 31, b'0', 2); INSERT INTO `employee` VALUES (5, '錢二明', '1', 'qianem@langfeiyes.com', 25, b'0', 2); INSERT INTO `employee` VALUES (6, '孫總', '1', 'sunz@langfeiyes.com', 35, b'0', 3); INSERT INTO `employee` VALUES (7, '孫三明', '1', 'sunsm@langfeiyes.com', 25, b'0', 3); INSERT INTO `employee` VALUES (8, '李總', '1', 'liz@langfeiyes.com', 35, b'0', 4); INSERT INTO `employee` VALUES (9, '李四明', '1', 'lism@langfeiyes.com', 25, b'0', 4); INSERT INTO `employee` VALUES (10, '周總', '1', 'zhouz@langfeiyes.com', 19, b'0', 5); INSERT INTO `employee` VALUES (11, '周五明', '1', 'zhouwm@langfeiyes.com', 25, b'0', 5); INSERT INTO `employee` VALUES (12, '吳總', '1', 'wuz@langfeiyes.com', 41, b'0', 5); INSERT INTO `employee` VALUES (13, '吳六明', '1', 'wulm@langfeiyes.com', 33, b'0', 5); INSERT INTO `employee` VALUES (14, '鄭總', '1', 'zhengz@langfeiyes.com', 35, b'0', 3); INSERT INTO `employee` VALUES (15, '鄭七明', '1', 'zhengqm@langfeiyes.com', 25, b'0', 2); INSERT INTO `employee` VALUES (16, '孫四明', '1', 'sunsim@langfeiyes.com', 25, b'0', 3); INSERT INTO `employee` VALUES (17, '孫五明', '1', 'sunwm@langfeiyes.com', 25, b'0', 3); INSERT INTO `employee` VALUES (18, '李五明', '1', 'liwm@langfeiyes.com', 25, b'0', 4); INSERT INTO `employee` VALUES (19, '李六明', '1', 'lilm@langfeiyes.com', 25, b'0', 4); INSERT INTO `employee` VALUES (20, '葉子', '1', 'yezi@langfeiyes.com', 0, b'0', 1);
2> 依賴引入:
- MyBatis-Plus:MyBatis-Plus 是 MyBatis 的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上提供了更多便捷易用的功能,如代碼生成器、通用 CRUD 操作等。
- Druid:Druid 是一個(gè)高性能的開源數(shù)據(jù)庫(kù)連接池,它提供了監(jiān)控、防火墻、緩存等功能,能夠有效地管理數(shù)據(jù)庫(kù)連接,提高數(shù)據(jù)庫(kù)訪問的性能。
- mysql-connector-java:這是 MySQL 數(shù)據(jù)庫(kù)的官方 JDBC 驅(qū)動(dòng)程序,用于在 Java 應(yīng)用程序中連接和操作 MySQL 數(shù)據(jù)庫(kù)。
- Lombok:Lombok 是一個(gè) Java 庫(kù),它通過注解的方式來簡(jiǎn)化 Java 代碼的編寫,可以自動(dòng)生成構(gòu)造函數(shù)、getter/setter 方法等,減少樣板代碼。
- JUnit:JUnit 是一個(gè)流行的 Java 單元測(cè)試框架,用于編寫和運(yùn)行單元測(cè)試,確保代碼的質(zhì)量和可靠性。
- Spring-Test:Spring Test 是 Spring 框架中用于編寫單元測(cè)試和集成測(cè)試的模塊,提供了各種測(cè)試 Spring 應(yīng)用程序的工具和支持。
- Spring-Context:Spring Context 是 Spring 框架的核心部分之一,提供了依賴注入(DI)功能,用于管理對(duì)象的創(chuàng)建和組裝。
- Spring-Tx:Spring Tx 是 Spring 框架中用于事務(wù)管理的模塊,提供了對(duì)聲明式事務(wù)、編程式事務(wù)的支持。
- Spring-JDBC:Spring JDBC 是 Spring 框架中用于簡(jiǎn)化 JDBC 編程的模塊,提供了模板類和回調(diào)函數(shù)等功能,減少了傳統(tǒng) JDBC 編程的樣板代碼。
- SLF4J-log4j12:SLF4J 是一個(gè)簡(jiǎn)單日志門面,允許你在后臺(tái)使用任意一個(gè)日志系統(tǒng)(如 log4j、logback 等),這里的 "log4j12" 可能是指與 Log4j 版本 1.2 兼容的適配器。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.4.3.4</version>
</dependency>
<!--數(shù)據(jù)連接池依賴-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
<!--mysql驅(qū)動(dòng)依賴-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<!--自動(dòng)生成getter/setter方法依賴-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
<scope>provided</scope>
</dependency>
<!--單元測(cè)試-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--spring測(cè)試-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.16.RELEASE</version>
</dependency>
<!--spring環(huán)境依賴包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.16.RELEASE</version>
</dependency>
<!--spring事務(wù)依賴包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.16.RELEASE</version>
</dependency>
<!--spring jdbc依賴包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.16.RELEASE</version>
</dependency>
<!--spring 日志依賴包-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
</dependencies>
3> 配置數(shù)據(jù)db.properties、日志文件log4j.properties、spring容器文件spring-context-mybatis.xml
jdbc.url=jdbc:mysql://localhost:3306/mybatis-plus?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8 jdbc.username=root jdbc.password=123456 jdbc.driverClassName=com.mysql.cj.jdbc.Driver
# Global logging configuration log4j.rootLogger=ERROR, stdout # 設(shè)置 com.langfeiyes.mp.mapper 包下的日志級(jí)別為 TRACE,表示輸出該包下所有類的 TRACE 級(jí)別的日志信息 log4j.logger.com.example.demo.mapper=TRACE # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<!-- 加載配置屬性文件 -->
<context:property-placeholder location="classpath:db.properties" ignore-unresolvable="true" />
<!-- 配置數(shù)據(jù)源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="url" value="${jdbc.url}"></property>
</bean>
<!-- 配置SessionFactory -->
<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- MyBatis 動(dòng)態(tài)掃描 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.langfeiyes.mp.mapper"/>
</bean>
</beans>3> 編寫Employee實(shí)體類與mapper接口
@Setter:用在類上,為類中所有屬性生成 setter 方法。@Getter:用在類上,為類中所有屬性生成 getter 方法。@ToString:用在類上,生成一個(gè) toString 方法,默認(rèn)輸出格式為類名及其屬性值。
Employee.java
package com.example.demo.domain;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Setter
@Getter
@ToString
public class Employee {
private Long id;
private String name;
private String password;
private String email;
private int age;
private int admin;
private Long deptId;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getAdmin() {
return admin;
}
public void setAdmin(int admin) {
this.admin = admin;
}
public Long getDeptId() {
return deptId;
}
public void setDeptId(Long deptId) {
this.deptId = deptId;
}
}
EmployeeMapper.java
package com.example.demo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.domain.Employee;
/**
*
* 持久層映射接口:mybatis-plus
* mybatis-plus mapper接口自定義
* 1:自定義一個(gè)接口, 繼承BaseMapper
* BaseMapper接口通常定義了對(duì)數(shù)據(jù)庫(kù)表的基本 CRUD(Create, Read, Update, Delete)操作,以及其他常用的查詢方法
* 2:指定接口泛型:當(dāng)前接口操作實(shí)體對(duì)象:Employee
*
*/
public interface EmployeeMapper extends BaseMapper<Employee> {
}
4> 編寫測(cè)試類
package com.example.demo;
import com.example.demo.domain.Employee;
import com.example.demo.mapper.EmployeeMapper;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring-context-mybatis.xml"})
public class MapperTest {
@Autowired
private EmployeeMapper employeeMapper;
@Test
public void testSave(){
Employee employee = new Employee();
employee.setAdmin(1);
employee.setAge(18);
employee.setDeptId(1L);
employee.setEmail("yezi@langfeiyes.com");
employee.setName("yezi");
employee.setPassword("111");
employeeMapper.insert(employee);
}
@Test
public void testUpdate(){
Employee employee = new Employee();
employee.setId(1L);
employee.setAdmin(1);
employee.setAge(18);
employee.setDeptId(1L);
employee.setEmail("yezi@langfeiyes.com");
employee.setName("yezi");
employee.setPassword("111");
employeeMapper.updateById(employee);
}
@Test
public void testDelete(){
employeeMapper.deleteById(1L);
}
@Test
public void testGet(){
System.out.println(employeeMapper.selectById(1L));
}
@Test
public void testList(){
System.out.println(employeeMapper.selectList(null));
}
}

案例二:springboot 版本的案例
1> 導(dǎo)入依賴
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.4</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>mybatis-plus-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>mybatis-plus-demo</name> <description>mybatis-plus-demo</description> <properties> <java.version>21</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency> <!--mybatis-plus依賴--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.5</version> </dependency> <!--數(shù)據(jù)連接池依賴--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.17</version> </dependency> <!--mysql驅(qū)動(dòng)依賴--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.22</version> </dependency> <!--測(cè)試依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <!--自動(dòng)生成getter/setter方法依賴--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2> 在application.properties文件中配置數(shù)據(jù)庫(kù)連接四要素與日志
#mysql spring.datasource.url=jdbc:mysql://localhost:3306/mybatis-plus?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8 spring.datasource.username=root spring.datasource.password=admin spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # 配置sql打印日志 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
3> 編寫Employee實(shí)體類與mapper接口(與上個(gè)案例一致)
4> 運(yùn)行testList方法

(不知道,為什么出現(xiàn)中文亂碼)
02 原理解析
兩個(gè)問題:
- 接口 中并未寫crud方法,為什么能實(shí)現(xiàn)crud方法操作?
- EmployeeMapper接口繼承了BaseMapper接口,BaseMapper接口自定義了很多crud方法,所以即使EmployeeMapper接口沒寫,它也可以從BaseMapper接口繼承而來。
- 整個(gè)項(xiàng)目中并沒有sql語句的編寫,為什么能執(zhí)行sql語句?
- 項(xiàng)目中沒有,但是又能執(zhí)行,說明了啥?說明了Mybatis-Plus框架幫我們實(shí)現(xiàn)了。Java 中的實(shí)體類跟Mysql中的表一一對(duì)應(yīng)(映射)。
- 對(duì)象 -- 表
- 對(duì)象屬性 -- 列

到此這篇關(guān)于Mybatis-plus+通用mapper(tk.mybatis)的使用的文章就介紹到這了,更多相關(guān)Mybatis-plus通用mapper內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文帶你理解@RefreshScope注解實(shí)現(xiàn)動(dòng)態(tài)刷新原理
RefeshScope這個(gè)注解想必大家都用過,在微服務(wù)配置中心的場(chǎng)景下經(jīng)常出現(xiàn),他可以用來刷新Bean中的屬性配置,那大家對(duì)他的實(shí)現(xiàn)原理了解嗎,它為什么可以做到動(dòng)態(tài)刷新呢,所以本文小編將給大家詳細(xì)介紹@RefreshScope注解實(shí)現(xiàn)動(dòng)態(tài)刷新原理2023-07-07
Java synchronized線程交替運(yùn)行實(shí)現(xiàn)過程詳解
這篇文章主要介紹了Java synchronized線程交替運(yùn)行實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
SpringCloud連接不上遠(yuǎn)程N(yùn)acos問題排查
本文主要介紹了SpringCloud連接不上遠(yuǎn)程N(yùn)acos問題排查,可能是因?yàn)槲撮_放端口,或集群內(nèi)部通信異常等,下面就來介紹一下問題解決,感興趣的可以了解一下2024-06-06
MyBatis-Plus+Druid配置及應(yīng)用詳解
這篇文章主要介紹了MyBatis-Plus+Druid配置及應(yīng)用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Java將字符串轉(zhuǎn)化為數(shù)組的兩種方法
Java中的String類是一種特殊的字符串,它可以被用于處理字符串,Java中的String類也可以將字符串轉(zhuǎn)換為數(shù)組,下面這篇文章主要給大家介紹了關(guān)于Java將字符串轉(zhuǎn)化為數(shù)組的兩種方法,需要的朋友可以參考下2023-05-05
Java代理模式實(shí)例詳解【靜態(tài)代理與動(dòng)態(tài)代理】
這篇文章主要介紹了Java代理模式,結(jié)合實(shí)例形式詳細(xì)分析了java靜態(tài)代理與動(dòng)態(tài)代理模式相關(guān)概念、原理、操作技巧與注意事項(xiàng),需要的朋友可以參考下2019-09-09

