笔记_0411_mbatis-plus
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());
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!