笔记_0411_mbatis-plus

发布时间 2023-04-17 10:51:31作者: 某夏

1. 正文

1. springboot自动装配原理---
2. springboot整合mbatis-plus

2. springboot自动装配原理

2.1 springboot包扫描原理

默认包扫描的是主类所在的包以及子包。

主函数在运行时会加载一个使用@SpringBootApplication标记的类。而该注解是一个复合注解,包含@EnableAutoConfiguration,这个注解开启了自动配置功能。 该注解也是一个复合注解,包含@AutoConfigurationPackage。 该注解中包含@Import({Registrar.class}),这个注解引入Registrar类。该类中存在registerBeanDefinitions,可以获取扫描的包名。

如果需要人为修改扫描包的名称则需要在主类上@ComponentScan(basepackage={"包名"})

2.2 springboot自动装配原理

思考: 有没有自己使用DispatcherServlet. 为什么DispatcherServlet能用。
在Spring MVC中,DispatcherServlet是整个请求处理流程的核心,它拦截所有请求并依据特定规则将请求分发给相应的处理器。当我们使用Spring Boot创建Web应用时,Spring Boot会自动为我们配置DispatcherServlet以及一系列相关组件和配置。这是因为Spring Boot利用了自动装配机制,通过使用注解、配置文件和条件化Bean注册等策略,根据开发者的需求和环境自动装配相应的组件、配置和依赖,减少了配置工作,缩短了开发周期。例如,当我们在pom.xml中引入spring-boot-starter-web依赖时,Spring Boot就会自动将DispatcherServlet、HandlerMapping、ViewResolver等相关组件注册到IoC容器中。由此可见,DispatcherServlet能用的原因在于Spring Boot的自动装配机制,它能够根据我们的需求自动注册相应的组件和配置,从而让我们简化了很多配置工作。

主函数在运行会执行一个使用@SpringbootApplication注解的类,该注解是一个复合注解,包含@EnableAutoConfiguration, 该注解开启自动配置功能,该注解也是一个复合注解,包含@Import() 该注解需要导入AutoConfigurationImportSelector类。 该类会加载很多自动装配类,而这些自动装配类完成相应的自动装配原理。

3. springboot整合mybatis-plus

3.1 mybatis-plus概述

MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

不能替代mybatis ,以后对于单表操作的所有功能,都可以使用mybatis-plus完成。但是链表操作的功能还得要校验mybatis.

3.2 如何使用mybatis-plus

(1)创建一个springboot工程并引入相关的依赖

<?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>2.5.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.xhw</groupId>
    <artifactId>springboot3</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot3</name>
    <description>springboot3</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.16</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--swagger2依赖-->
        <dependency>
            <groupId>com.spring4all</groupId>
            <artifactId>swagger-spring-boot-starter</artifactId>
            <version>1.9.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>swagger-bootstrap-ui</artifactId>
            <version>1.7.8</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>


(2)创建表加入数据

DELETE FROM user;

INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

(3)配置数据源

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=320023
spring.datasource.url=jdbc:mysql:///db6

(4)创建实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

(5)创建一个dao接口

public interface UserDao extends BaseMapper<User> {
}

(6)为接口生成代理实现类

@SpringBootApplication
@MapperScan(basePackages = "com.xhw.dao")
public class Springboot3Application {
    public static void main(String[] args) {
        SpringApplication.run(Springboot3Application.class, args);
    }

}

(7)测试

package com.xhw;

import com.xhw.dao.UserMapper;
import com.xhw.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class Springboot3ApplicationTests {

    @Autowired
    private UserMapper userDao;
    @Test
    void testFindById() {
        User user = userDao.selectById(4);
        System.out.println(user);
    }

}

注意:dao继承BaseMapper<>接口 ;接口扫描

3.3 使用mybatis-plus完成CRUD

@@SpringBootTest
class Springboot3ApplicationTests {

   @Resource
    private StudentMapper studentMapper;
    @Test
    void findAll() {
        List<Student> students = studentMapper.selectList(null);
        System.out.println(students);
    }
    @Test
    void findById() {
        Student student = studentMapper.selectById(1);
        System.out.println(student);
    }

   
    @Test
    void insert() {
        Student student1 = new Student("xh", 18, 4);
        student1.setSname("ddd");
        student1.setAge(16);
        student1.setCid(1);
        int insert = studentMapper.insert(student1);
        System.out.println(insert);
    }
    @Test
    void update() {
        Student student1 = new Student("xh", 18, 4);
        student1.setSid(15);
        student1.setSname("bbb");
        student1.setAge(16);
        student1.setCid(1);
        int i = studentMapper.updateById(student1);
        System.out.println(i);
    }

    @Test
    void delete() {
        int i = studentMapper.deleteById(29);
        System.out.println(i);
    }
    @Test
    void deleteBatchIds() {
        List<Integer> ids = new ArrayList<>();
        ids.add(15);
        ids.add(7);
        ids.add(8);
        int i = studentMapper.deleteBatchIds(ids);
        System.out.println(i);
    }


    @Test
    public void testPage2(){
        Page<Student> page=new Page<>(1,5);
        QueryWrapper<Student> wrapper=new QueryWrapper<>();
        wrapper.gt("age",15);
        studentMapper.findPage(page,wrapper);
        System.out.println("当前页的记录"+page.getRecords());
        System.out.println("获取总页数"+page.getPages());
        System.out.println("获取总条数"+page.getTotal());
    }

 /**
     * 条件查询
     */
    @Test
    void find1(){
        QueryWrapper<Student> wrapper=new QueryWrapper<>(); //
        wrapper.likeRight("sName","_a");
        wrapper.between("age",15,25);
        wrapper.orderByAsc("age");
        wrapper.select("sName","age");
        List<Student> students = studentMapper.selectList(wrapper);
        System.out.println(students);
    }
    /**
     * 分页查询
     * 分页需求--PageHelper---默认mp分页需要加分页拦截器
     */
    @Test
    public void testPage(){
        Page<Student> page=new Page<>(1,3);
        studentMapper.selectPage(page,null);
        System.out.println("当前页的记录"+page.getRecords());
        System.out.println("获取总页数"+page.getPages());
        System.out.println("获取总条数"+page.getTotal());
    }
}