欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Mybatis-plus+通用mapper(tk.mybatis)的使用,

来源: javaer 分享于  点击 6446 次 点评:241

Mybatis-plus+通用mapper(tk.mybatis)的使用,


目录
  • 01 引言
    • 1)MyBatis与MyBatis-Plus区别
    • 2)Mybatis-plus入门案例
  • 02 原理解析

    01 引言

    常规的MyBatis操作MySQL步骤

    1>创建数据库,创建表

    2>创建项目,导入逆向工程相对应的依赖与配置

    3>逆向工程创建实体/mapper接口/mapper.xml映射文件

    4>导入mybatis依赖,mysql依赖

    5>编写测试类,测试mapper接口实现CRUD操作

    问题:复杂项目Mybatis太过冗余。项目中,每张表对应一个实体类,对应一个mapper.java接口,也对应一个mapper.xml配置文件。每个mapper,java接口都有重复的增、删、改、查4个基础方法,每一个Mapper.xml都有重复的增、删、改、查4个基础sql语句。使用逆向工程可以解决,但是存在很致命的问题,如果列发生变动,对应的sql改动那就是灾难啦。另外,如果一个项目很复杂,那这些文件就膨胀起来,对项目的加载与维护带来很大挑战。此时不禁想,有没有某种方法可以不写crud方法,不写crud sql语句也能完成crud操作呢?

    1)MyBatis与MyBatis-Plus区别

    MyBatis:

    优点

    • 1>SQL语句自由控制,较为灵活
    • 2>SQL与业务代码分离,易于阅读与维护
    • 3>提供动态SQL语句,可以根据需求灵活控制

    缺点

    • 1>简单的crud操作也必须提供对应SQL语句
    • 2>必须维护大量的xml文件
    • 3>自身功能有限,要拓展只能依赖第三方插件

    MyBatis-Plus 是在Mybatis的基础上进行二次开发的具有MyBatis所有功能,也添加了不少好用的功能

    比如 :

    • 1>提供无sql的crud操作
    • 2>内置代码生成器,分页插件 ,性能分析插件等
    • 3>提供功能丰富的条件构造器快速进行无sql开发
    • 4>提供统一全局处理比如: 乐观锁、逻辑删除等

    2)Mybatis-plus入门案例

     案例一:spring容器版本的案例

    1> sql导入:

    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 的增强工具,在 MyBatis 的基础上提供了更多便捷易用的功能,如代码生成器、通用 CRUD 操作等。
    • Druid:Druid 是一个高性能的开源数据库连接池,它提供了监控、防火墙、缓存等功能,能够有效地管理数据库连接,提高数据库访问的性能。
    • mysql-connector-java:这是 MySQL 数据库的官方 JDBC 驱动程序,用于在 Java 应用程序中连接和操作 MySQL 数据库。
    • Lombok:Lombok 是一个 Java 库,它通过注解的方式来简化 Java 代码的编写,可以自动生成构造函数、getter/setter 方法等,减少样板代码。
    • JUnit:JUnit 是一个流行的 Java 单元测试框架,用于编写和运行单元测试,确保代码的质量和可靠性。
    • Spring-Test:Spring Test 是 Spring 框架中用于编写单元测试和集成测试的模块,提供了各种测试 Spring 应用程序的工具和支持。
    • Spring-Context:Spring Context 是 Spring 框架的核心部分之一,提供了依赖注入(DI)功能,用于管理对象的创建和组装。
    • Spring-Tx:Spring Tx 是 Spring 框架中用于事务管理的模块,提供了对声明式事务、编程式事务的支持。
    • Spring-JDBC:Spring JDBC 是 Spring 框架中用于简化 JDBC 编程的模块,提供了模板类和回调函数等功能,减少了传统 JDBC 编程的样板代码。
    • SLF4J-log4j12:SLF4J 是一个简单日志门面,允许你在后台使用任意一个日志系统(如 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>
    
            <!--数据连接池依赖-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.2.8</version>
            </dependency>
    
            <!--mysql驱动依赖-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.22</version>
            </dependency>
            <!--自动生成getter/setter方法依赖-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.16</version>
                <scope>provided</scope>
            </dependency>
            <!--单元测试-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
            <!--spring测试-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>5.2.16.RELEASE</version>
            </dependency>
    
            <!--spring环境依赖包-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>5.2.16.RELEASE</version>
            </dependency>
            <!--spring事务依赖包-->
            <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> 配置数据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
    
    # 设置 com.langfeiyes.mp.mapper 包下的日志级别为 TRACE,表示输出该包下所有类的 TRACE 级别的日志信息
    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" />
        <!-- 配置数据源 -->
        <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 动态扫描  -->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="com.langfeiyes.mp.mapper"/>
        </bean>
    </beans>

     3> 编写Employee实体类与mapper接口

    • @Setter:用在类上,为类中所有属性生成 setter 方法。
    • @Getter:用在类上,为类中所有属性生成 getter 方法。
    • @ToString:用在类上,生成一个 toString 方法,默认输出格式为类名及其属性值。  

    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:自定义一个接口, 继承BaseMapper
     * BaseMapper接口通常定义了对数据库表的基本 CRUD(Create, Read, Update, Delete)操作,以及其他常用的查询方法
     * 2:指定接口泛型:当前接口操作实体对象:Employee
     *
     */
    
    public interface EmployeeMapper extends BaseMapper<Employee> {
    
    }
    

    4> 编写测试类

    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> 导入依赖

    <?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>
    
    		<!--数据连接池依赖-->
    		<dependency>
    			<groupId>com.alibaba</groupId>
    			<artifactId>druid-spring-boot-starter</artifactId>
    			<version>1.1.17</version>
    		</dependency>
    		<!--mysql驱动依赖-->
    		<dependency>
    			<groupId>mysql</groupId>
    			<artifactId>mysql-connector-java</artifactId>
    			<version>8.0.22</version>
    		</dependency>
    		<!--测试依赖-->
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-test</artifactId>
    		</dependency>
    		<!--自动生成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文件中配置数据库连接四要素与日志

    #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实体类与mapper接口(与上个案例一致)

    4> 运行testList方法

    (不知道,为什么出现中文乱码)

    02 原理解析

    两个问题: 

    • 接口 中并未写crud方法,为什么能实现crud方法操作?
      • EmployeeMapper接口继承了BaseMapper接口,BaseMapper接口自定义了很多crud方法,所以即使EmployeeMapper接口没写,它也可以从BaseMapper接口继承而来。
    • 整个项目中并没有sql语句的编写,为什么能执行sql语句?
      • 项目中没有,但是又能执行,说明了啥?说明了Mybatis-Plus框架帮我们实现了。Java 中的实体类跟Mysql中的表一一对应(映射)。
      • 对象 -- 表
      • 对象属性 -- 列

    到此这篇关于Mybatis-plus+通用mapper(tk.mybatis)的使用的文章就介绍到这了,更多相关Mybatis-plus通用mapper内容请搜索3672js教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持3672js教程! 

    您可能感兴趣的文章:
    • 解决tk.mybatis中写自定义的mapper的问题
    • tk.mybatis如何扩展自己的通用mapper
    • 解决mybatis-plus通用mapper调用报错:Invalid bound statement
    • Mybatis通用Mapper(tk.mybatis)的使用
    相关栏目:

    用户点评