一、MyBatisPlus入门案例与简介

1、入门案例

a、开发方式

  1. 基于MyBatis使用MP
  2. 基于Spring使用MP
  3. 基于SpringBoot使用MP

    b、SpringBoot整合MyBatis开发过程

  4. 创建SpringBoot工程

  5. 勾选配置使用的技术
  6. 设置dataSource相关属性
  7. 定义数据层接口映射配置

c、案例

  1. 创建项目工程
  2. 创建数据库及数据表 ```sql create database if not exists db_mybatisplus character set utf8; use db_mybatisplus;

CREATE TABLE tb_user ( user_id BIGINT(20) PRIMARY KEY auto_increment, user_name VARCHAR(32) DEFAULT(“default_name”), user_pwd VARCHAR(32) DEFAULT(“default_pwd”), user_age INT(3) DEFAULT(21), user_tel VARCHAR(32) DEFAULT(“default_tel”) );

drop table tb_user;

insert into tb_user values(1,’Tom’,’tom’,3,’18866668888’); insert into tb_user values(2,’Jerry’,’jerry’,4,’16688886666’); insert into tb_user values(3,’Jock’,’123456’,41,’18812345678’); insert into tb_user values(4,’zhouge’,’aa’,15,’4006184000’);

SELECT * from tb_user;

  1. 3. 修改application.yml
  2. ```yaml
  3. spring:
  4. datasource:
  5. type: com.alibaba.druid.pool.DruidDataSource
  6. driver-class-name: com.mysql.cj.jdbc.Driver
  7. url: jdbc:mysql://localhost:3306/db_mybatisplus
  8. username: root
  9. password: root
  1. 创建pojo实体类 ```java package xyz.zhouge.pojo;

import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;

@Data @NoArgsConstructor @AllArgsConstructor @TableName(“tb_user”) public class User {

@TableId(“user_id”) private long userId ;

  1. @TableField("user_name")
  2. private String userName ;
  3. @TableField("user_pwd")
  4. private String password ;
  5. @TableField("user_age")
  6. private Integer userAge ;
  7. @TableField("user_tel")
  8. private String userTel ;

}

  1. 5. 创建dao接口
  2. ```java
  3. package xyz.zhouge.dao;
  4. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  5. import org.apache.ibatis.annotations.Mapper;
  6. import xyz.zhouge.pojo.User;
  7. @Mapper
  8. public interface UserDao extends BaseMapper<User>{
  9. }
  1. 创建service业务层
  2. 测试

2、MyBatisPlus简介

二、标准数据层开发

1、项目搭建

1,创建项目

image.png

2,引入maven依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>mysql</groupId>
  8. <artifactId>mysql-connector-java</artifactId>
  9. <scope>runtime</scope>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-test</artifactId>
  14. <scope>test</scope>
  15. </dependency>
  16. <!-- 引入数据库连接池 -->
  17. <dependency>
  18. <groupId>com.alibaba</groupId>
  19. <artifactId>druid</artifactId>
  20. <version>1.1.10</version>
  21. </dependency>
  22. <!-- 引入lombok -->
  23. <dependency>
  24. <groupId>org.projectlombok</groupId>
  25. <artifactId>lombok</artifactId>
  26. <version>1.18.12</version>
  27. </dependency>
  28. <!-- 引入mybatis-plus -->
  29. <dependency>
  30. <groupId>com.baomidou</groupId>
  31. <artifactId>mybatis-plus-boot-starter</artifactId>
  32. <version>3.4.1</version>
  33. </dependency>
  34. </dependencies>

3,配置yml文件

  1. spring:
  2. datasource:
  3. type: com.alibaba.druid.pool.DruidDataSource
  4. driver-class-name: com.mysql.cj.jdbc.Driver
  5. url: jdbc:mysql://zhouge.xyz:3306/db_mybatisplus
  6. username: admin
  7. password: 991227zg@.
  8. profiles:
  9. active: dev
  10. server:
  11. port: 80

4,创建数据模型

  1. import com.baomidou.mybatisplus.annotation.TableField;
  2. import com.baomidou.mybatisplus.annotation.TableId;
  3. import com.baomidou.mybatisplus.annotation.TableName;
  4. import lombok.AllArgsConstructor;
  5. import lombok.Data;
  6. import lombok.NoArgsConstructor;
  7. @Data
  8. @NoArgsConstructor
  9. @AllArgsConstructor
  10. @TableName("tb_user")
  11. public class User {
  12. @TableId("user_id")
  13. private long userId ;
  14. @TableField("user_name")
  15. private String userName ;
  16. @TableField("user_pwd")
  17. private String password ;
  18. @TableField("user_age")
  19. private Integer userAge ;
  20. @TableField("user_tel")
  21. private String userTel ;
  22. public User(String userName, String password) {
  23. this.userName = userName;
  24. this.password = password;
  25. }
  26. public User(long userId, String userName, String password) {
  27. this.userId = userId;
  28. this.userName = userName;
  29. this.password = password;
  30. }
  31. }

5,创建数据持久层

  1. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  2. import org.apache.ibatis.annotations.Mapper;
  3. import xyz.zhouge.pojo.User;
  4. @Mapper
  5. public interface UserDao extends BaseMapper<User>{
  6. }

6,创建测试

  1. import org.junit.jupiter.api.Test;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.boot.test.context.SpringBootTest;
  4. import xyz.zhouge.dao.UserDao;
  5. import xyz.zhouge.pojo.User;
  6. import java.util.List;
  7. @SpringBootTest
  8. public class TestUserService {
  9. @Autowired
  10. private UserService userService;
  11. @Autowired
  12. private UserDao userDao ;
  13. @Test
  14. public void testInsertUser(){
  15. int res = userDao.insert(new User("zhouge1","123456"));
  16. System.out.println(res > 0 ? "添加成功" : "添加失败");
  17. }
  18. @Test
  19. public void testDeleteUser(){
  20. int res = userDao.deleteById(6L);
  21. System.out.println(res > 0 ? "删除成功" : "删除失败");
  22. }
  23. @Test
  24. public void testUpdateUser(){
  25. int res = userDao.updateById(new User(4L,"admin","123456"));
  26. System.out.println(res > 0 ? "修改成功" : "修改失败");
  27. }
  28. @Test
  29. public void testGetAllUsers(){
  30. List<User> users = userService.getAllUsers();
  31. for (User user : users) {
  32. System.out.println(user);
  33. }
  34. }
  35. @Test
  36. public void testGetUserById(){
  37. User user = userDao.selectById(1L);
  38. System.out.println(user);
  39. }
  40. }

2、新增

  1. import org.junit.jupiter.api.Test;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.boot.test.context.SpringBootTest;
  4. import xyz.zhouge.dao.UserDao;
  5. import xyz.zhouge.pojo.User;
  6. import java.util.List;
  7. @SpringBootTest
  8. public class TestUserService {
  9. @Autowired
  10. private UserService userService;
  11. @Autowired
  12. private UserDao userDao ;
  13. @Test
  14. public void testInsertUser(){
  15. int res = userDao.insert(new User("zhouge1","123456"));
  16. System.out.println(res > 0 ? "添加成功" : "添加失败");
  17. }
  18. }

3、删除

  1. import org.junit.jupiter.api.Test;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.boot.test.context.SpringBootTest;
  4. import xyz.zhouge.dao.UserDao;
  5. import xyz.zhouge.pojo.User;
  6. import java.util.List;
  7. @SpringBootTest
  8. public class TestUserService {
  9. @Autowired
  10. private UserService userService;
  11. @Autowired
  12. private UserDao userDao ;
  13. @Test
  14. public void testDeleteUser(){
  15. int res = userDao.deleteById(6L);
  16. System.out.println(res > 0 ? "删除成功" : "删除失败");
  17. }
  18. }

4、修改

  1. import org.junit.jupiter.api.Test;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.boot.test.context.SpringBootTest;
  4. import xyz.zhouge.dao.UserDao;
  5. import xyz.zhouge.pojo.User;
  6. import java.util.List;
  7. @SpringBootTest
  8. public class TestUserService {
  9. @Autowired
  10. private UserService userService;
  11. @Autowired
  12. private UserDao userDao ;
  13. @Test
  14. public void testUpdateUser(){
  15. int res = userDao.updateById(new User(4L,"admin","123456"));
  16. System.out.println(res > 0 ? "修改成功" : "修改失败");
  17. }
  18. }

5、根据Id查询

  1. import org.junit.jupiter.api.Test;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.boot.test.context.SpringBootTest;
  4. import xyz.zhouge.dao.UserDao;
  5. import xyz.zhouge.pojo.User;
  6. import java.util.List;
  7. @SpringBootTest
  8. public class TestUserService {
  9. @Autowired
  10. private UserService userService;
  11. @Autowired
  12. private UserDao userDao ;
  13. @Test
  14. public void testGetUserById(){
  15. User user = userDao.selectById(1L);
  16. System.out.println(user);
  17. }
  18. }

6、查询所有

  1. import org.junit.jupiter.api.Test;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.boot.test.context.SpringBootTest;
  4. import xyz.zhouge.dao.UserDao;
  5. import xyz.zhouge.pojo.User;
  6. import java.util.List;
  7. @SpringBootTest
  8. public class TestUserService {
  9. @Autowired
  10. private UserService userService;
  11. @Autowired
  12. private UserDao userDao ;
  13. @Test
  14. public void testGetAllUsers(){
  15. List<User> users = userService.getAllUsers();
  16. for (User user : users) {
  17. System.out.println(user);
  18. }
  19. }
  20. }

7,分页查询

7.1,搭建项目

image.png

7.2,修改maven依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.mybatis.spring.boot</groupId>
  4. <artifactId>mybatis-spring-boot-starter</artifactId>
  5. <version>2.2.2</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>mysql</groupId>
  9. <artifactId>mysql-connector-java</artifactId>
  10. <scope>runtime</scope>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-starter-test</artifactId>
  15. <scope>test</scope>
  16. </dependency>
  17. <!--引入druid数据库连接池-->
  18. <dependency>
  19. <groupId>com.alibaba</groupId>
  20. <artifactId>druid</artifactId>
  21. <version>1.1.10</version>
  22. </dependency>
  23. <!--引入mybatis-plus-->
  24. <dependency>
  25. <groupId>com.baomidou</groupId>
  26. <artifactId>mybatis-plus-boot-starter</artifactId>
  27. <version>3.4.1</version>
  28. </dependency>
  29. <!--引入lombok-->
  30. <dependency>
  31. <groupId>org.projectlombok</groupId>
  32. <artifactId>lombok</artifactId>
  33. <version>1.18.12</version>
  34. </dependency>
  35. </dependencies>

7.3,配置application.yml

  1. spring:
  2. datasource:
  3. type: com.alibaba.druid.pool.DruidDataSource
  4. driver-class-name: com.mysql.cj.jdbc.Driver
  5. url: jdbc:mysql://zhouge.xyz:3306/db_mybatisplus
  6. username: admin
  7. password: 991227zg@.
  8. profiles:
  9. active: dev
  10. main:
  11. #springBoot 日志
  12. log-startup-info: off
  13. server:
  14. port: 80
  15. mybatis-plus:
  16. configuration:
  17. #mp 日志设置为标准日志
  18. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

7.4,创建数据模型

  1. import com.baomidou.mybatisplus.annotation.TableField;
  2. import com.baomidou.mybatisplus.annotation.TableId;
  3. import com.baomidou.mybatisplus.annotation.TableName;
  4. import lombok.AllArgsConstructor;
  5. import lombok.Data;
  6. import lombok.NoArgsConstructor;
  7. @Data
  8. @NoArgsConstructor
  9. @AllArgsConstructor
  10. @TableName("tb_user")
  11. public class User {
  12. @TableId("user_id")
  13. private long userId ;
  14. @TableField("user_name")
  15. private String userName ;
  16. @TableField("user_pwd")
  17. private String password ;
  18. @TableField("user_age")
  19. private Integer userAge ;
  20. @TableField("user_tel")
  21. private String userTel ;
  22. public User(String userName, String password) {
  23. this.userName = userName;
  24. this.password = password;
  25. }
  26. public User(long userId, String userName, String password) {
  27. this.userId = userId;
  28. this.userName = userName;
  29. this.password = password;
  30. }
  31. }

7.5,创建数据访问层

  1. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  2. import org.apache.ibatis.annotations.Mapper;
  3. import xyz.zhouge.pojo.User;
  4. @Mapper
  5. public interface UserDao extends BaseMapper<User>{
  6. }

7.6,创建拦截器

  1. import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
  2. import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. @Configuration
  6. public class PageInterceptor{
  7. @Bean
  8. public MybatisPlusInterceptor mybatisPlusInterceptor(){
  9. //1, 创建一个通用的拦截器
  10. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  11. //2,指定(添加) 特定的拦截器 分页拦截器
  12. interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
  13. //3,返回拦截器
  14. return interceptor;
  15. }
  16. }

7.7,添加logback配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3. </configuration>

7.8,测试

  1. import com.baomidou.mybatisplus.core.metadata.IPage;
  2. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  3. import org.junit.jupiter.api.Test;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.test.context.SpringBootTest;
  6. import xyz.zhouge.pojo.User;
  7. @SpringBootTest
  8. public class UserDaoTest {
  9. @Autowired
  10. private UserDao userDao;
  11. /**
  12. * 未添加分页拦截器
  13. */
  14. @Test
  15. public void testPage1() {
  16. //1,创建分页对象
  17. Page<User> page = new Page<User>(1, 2);
  18. //2,执行分页查询
  19. Page<User> userPage = userDao.selectPage(page, null);
  20. //3,获取分页结果
  21. System.out.println("当前页码值:" + userPage.getCurrent());
  22. System.out.println("每页显示数:" + userPage.getSize());
  23. System.out.println("一共多少页:" + userPage.getPages());
  24. System.out.println("一共多少条数据:" + userPage.getTotal());
  25. System.out.println("数据:" + userPage.getRecords());
  26. }
  27. @Test
  28. public void testPage2() {
  29. IPage page = new Page(1, 2);
  30. //2,执行分页查询
  31. IPage userPage = userDao.selectPage(page, null);
  32. //3,获取分页结果
  33. System.out.println("当前页码值:" + userPage.getCurrent());
  34. System.out.println("每页显示数:" + userPage.getSize());
  35. System.out.println("一共多少页:" + userPage.getPages());
  36. System.out.println("一共多少条数据:" + userPage.getTotal());
  37. System.out.println("数据:" + userPage.getRecords());
  38. }
  39. }

三、DQL编程控制

image.png

1、条件查询

方法名 作用
lt(column , val) 查询column 该字段的值小于val的集合
gt(column , val) 查询column 该字段的值大于val的集合
eq(column , val) 查询column 该字段的值等于val的集合
or() 或 关系
….

1.1,搭建项目

1.2,引入maven依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.mybatis.spring.boot</groupId>
  4. <artifactId>mybatis-spring-boot-starter</artifactId>
  5. <version>2.2.2</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>mysql</groupId>
  9. <artifactId>mysql-connector-java</artifactId>
  10. <scope>runtime</scope>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-starter-test</artifactId>
  15. <scope>test</scope>
  16. </dependency>
  17. <!--引入mybatis-plus-->
  18. <dependency>
  19. <groupId>com.baomidou</groupId>
  20. <artifactId>mybatis-plus-boot-starter</artifactId>
  21. <version>3.4.1</version>
  22. </dependency>
  23. <!--引入数据库连接池-->
  24. <dependency>
  25. <groupId>com.alibaba</groupId>
  26. <artifactId>druid</artifactId>
  27. <version>1.1.10</version>
  28. </dependency>
  29. <!--引入lombok-->
  30. <dependency>
  31. <groupId>org.projectlombok</groupId>
  32. <artifactId>lombok</artifactId>
  33. <version>1.18.12</version>
  34. </dependency>
  35. </dependencies>

1.3,配置application.yml

  1. spring:
  2. datasource:
  3. type: com.alibaba.druid.pool.DruidDataSource
  4. driver-class-name: com.mysql.cj.jdbc.Driver
  5. url: jdbc:mysql://zhouge.xyz:3306/db_mybatisplus
  6. username: admin
  7. password: 991227zg@.
  8. profiles:
  9. active: dev
  10. main:
  11. #springBoot 日志
  12. log-startup-info: off
  13. banner-mode: off
  14. server:
  15. port: 80
  16. mybatis-plus:
  17. configuration:
  18. #mp 日志设置为标准日志
  19. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  20. global-config:
  21. banner: off

1.4,配置logback.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3. </configuration>

1.5,创建数据模型

  1. import com.baomidou.mybatisplus.annotation.TableField;
  2. import com.baomidou.mybatisplus.annotation.TableId;
  3. import com.baomidou.mybatisplus.annotation.TableName;
  4. import lombok.AllArgsConstructor;
  5. import lombok.Data;
  6. import lombok.NoArgsConstructor;
  7. @Data
  8. @NoArgsConstructor
  9. @AllArgsConstructor
  10. @TableName("tb_user")
  11. public class User {
  12. @TableId("user_id")
  13. private long userId ;
  14. @TableField("user_name")
  15. private String userName ;
  16. @TableField("user_pwd")
  17. private String password ;
  18. @TableField("user_age")
  19. private Integer userAge ;
  20. @TableField("user_tel")
  21. private String userTel ;
  22. public User(String userName, String password) {
  23. this.userName = userName;
  24. this.password = password;
  25. }
  26. public User(long userId, String userName, String password) {
  27. this.userId = userId;
  28. this.userName = userName;
  29. this.password = password;
  30. }
  31. }

1.6,创建数据持久层

  1. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  2. import org.apache.ibatis.annotations.Mapper;
  3. import xyz.zhouge.pojo.User;
  4. @Mapper
  5. public interface UserDao extends BaseMapper<User>{
  6. }

1.7,测试

  1. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import org.junit.jupiter.api.Test;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.test.context.SpringBootTest;
  6. import xyz.zhouge.pojo.User;
  7. import xyz.zhouge.pojo.quert.QueryUser;
  8. import java.util.List;
  9. @SpringBootTest
  10. public class UserDaoTest {
  11. @Autowired
  12. private UserDao userDao ;
  13. @Test
  14. public void testSelectList(){
  15. List<User> users = userDao.selectList(null);
  16. users.forEach(user -> System.out.println(user));
  17. }
  18. // todo 测试QueryWrapper
  19. @Test
  20. public void testSelectList1(){
  21. //创建查询条件包装器 未添加条件,则为空条件
  22. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  23. //执行查询
  24. List<User> users = userDao.selectList(queryWrapper);
  25. //输出
  26. users.forEach(user -> System.out.println(user));
  27. }
  28. // todo 多条件查询
  29. @Test
  30. public void testSelectList2(){
  31. //创建查询条件包装器
  32. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  33. queryWrapper.gt("user_age",10);//添加查询条件,user_age 字段大于10
  34. queryWrapper.lt("user_age",40);//添加查询条件,user_age 字段小于40
  35. //执行查询
  36. List<User> users = userDao.selectList(queryWrapper);
  37. //输出
  38. users.forEach(user -> System.out.println(user));
  39. }
  40. // todo 测试 LambdaQueryWrapper
  41. @Test
  42. public void testSelectList3(){
  43. //创建查询条件包装器
  44. LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  45. lambdaQueryWrapper.gt(User::getUserAge,10);
  46. lambdaQueryWrapper.lt(User::getUserAge,40);
  47. //执行查询
  48. List<User> users = userDao.selectList(lambdaQueryWrapper);
  49. //输出
  50. users.forEach(user -> System.out.println(user));
  51. }
  52. // todo 测试 or()
  53. @Test
  54. public void testSelectList4(){
  55. //创建查询条件包装器
  56. LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  57. lambdaQueryWrapper.gt(User::getUserAge,20)
  58. .or()
  59. .lt(User::getUserAge,10);
  60. //执行查询
  61. List<User> users = userDao.selectList(lambdaQueryWrapper);
  62. //输出
  63. users.forEach(user -> System.out.println(user));
  64. }
  65. // todo 测试eq()
  66. @Test
  67. public void testSelectList5(){
  68. //创建查询条件包装器
  69. LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  70. lambdaQueryWrapper.eq(User::getUserName,"Tom");
  71. //执行查询
  72. List<User> users = userDao.selectList(lambdaQueryWrapper);
  73. //输出
  74. users.forEach(user -> System.out.println(user));
  75. }
  76. // todo 测试null 1
  77. @Test
  78. public void testSelectNull(){
  79. //模拟从网页传递过来的数据
  80. QueryUser queryUser = new QueryUser();
  81. //queryUser.setUserAge(20);
  82. queryUser.setAge2(40);
  83. //创建查询条件包装器
  84. LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  85. lambdaQueryWrapper.gt(User::getUserAge,queryUser.getUserAge());
  86. lambdaQueryWrapper.lt(User::getUserAge,queryUser.getAge2());
  87. //执行查询
  88. List<User> users = userDao.selectList(lambdaQueryWrapper);
  89. //输出
  90. users.forEach(user -> System.out.println(user));
  91. }
  92. // todo 测试null 2
  93. @Test
  94. public void testSelectNull2(){
  95. //模拟从网页传递过来的数据
  96. QueryUser queryUser = new QueryUser();
  97. queryUser.setUserAge(20);
  98. //queryUser.setAge2(40);
  99. //创建查询条件包装器
  100. LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  101. if (null != queryUser.getUserAge()){
  102. lambdaQueryWrapper.gt(User::getUserAge,queryUser.getUserAge());
  103. }
  104. if (null != queryUser.getAge2()){
  105. lambdaQueryWrapper.lt(User::getUserAge,queryUser.getAge2());
  106. }
  107. //执行查询
  108. List<User> users = userDao.selectList(lambdaQueryWrapper);
  109. //输出
  110. users.forEach(user -> System.out.println(user));
  111. }
  112. // todo 测试null 3
  113. @Test
  114. public void testSelectNull3(){
  115. //模拟从网页传递过来的数据
  116. QueryUser queryUser = new QueryUser();
  117. //queryUser.setUserAge(10);
  118. queryUser.setAge2(40);
  119. //创建查询条件包装器
  120. LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  121. // 如果condition 为 true ,则添加条件 ; 如果为false 则不添加
  122. lambdaQueryWrapper.gt(null != queryUser.getUserAge() , User::getUserAge ,queryUser.getUserAge());
  123. lambdaQueryWrapper.lt(null != queryUser.getAge2() , User::getUserAge ,queryUser.getAge2());
  124. //执行查询
  125. List<User> users = userDao.selectList(lambdaQueryWrapper);
  126. //输出
  127. users.forEach(user -> System.out.println(user));
  128. }
  129. }

2、查询投影

  1. package xyz.zhouge.dao;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import org.junit.jupiter.api.Test;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.boot.test.context.SpringBootTest;
  7. import xyz.zhouge.pojo.User;
  8. import java.util.List;
  9. import java.util.Map;
  10. @SpringBootTest
  11. public class UserDaoTest {
  12. @Autowired
  13. private UserDao userDao ;
  14. @Test
  15. public void testField(){
  16. LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
  17. List<User> users = userDao.selectList(lqw);
  18. users.forEach(user -> System.out.println(user));
  19. }
  20. @Test
  21. public void testField1(){
  22. LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
  23. //指定需要查询的字段 LambdaQueryWrapper 可以用 Lambda 来表示
  24. lqw.select(User::getUserId,User::getUserName,User::getUserTel);
  25. List<User> users = userDao.selectList(lqw);
  26. users.forEach(user -> System.out.println(user));
  27. }
  28. @Test
  29. public void testField2(){
  30. QueryWrapper<User> qw = new QueryWrapper<>();
  31. //指定需要查询的字段 QueryWrapper 只能使用字符串来表示
  32. qw.select("user_id","user_name","user_tel");
  33. List<User> users = userDao.selectList(qw);
  34. users.forEach(user -> System.out.println(user));
  35. }
  36. @Test
  37. public void testField3(){
  38. QueryWrapper<User> qw = new QueryWrapper<>();
  39. //指定需要查询的字段 不能使用 LambdaQueryWrapper
  40. //qw.select("avg(user_age)");
  41. //qw.select("max(user_age)");
  42. qw.select("count(*) as count");
  43. //使用 selectMaps 将查询的字段作为键名 , 查询的结果作为值
  44. List<Map<String, Object>> maps = userDao.selectMaps(qw);
  45. maps.forEach(map -> System.out.println(map));
  46. }
  47. //todo 分组查询
  48. @Test
  49. public void testField4(){
  50. QueryWrapper<User> qw = new QueryWrapper<>();
  51. //指定需要查询的字段 不能使用 LambdaQueryWrapper
  52. qw.select("count(*) as count,user_tel");
  53. //qw.groupBy("user_tel");
  54. //使用 selectMaps 将查询的字段作为键名 , 查询的结果作为值
  55. List<Map<String, Object>> maps = userDao.selectMaps(qw);
  56. maps.forEach(map -> System.out.println(map));
  57. }
  58. //todo 模糊查询
  59. @Test
  60. public void testField5(){
  61. LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
  62. lqw.select(User::getUserId,User::getUserName,User::getPassword);
  63. //lqw.like(User::getUserName,"tom");
  64. //lqw.likeLeft(User::getUserName,"om");
  65. //lqw.likeRight(User::getUserName,"T");
  66. //使用 selectMaps 将查询的字段作为键名 , 查询的结果作为值
  67. List<Map<String, Object>> maps = userDao.selectMaps(lqw);
  68. maps.forEach(map -> System.out.println(map));
  69. }
  70. //todo 等值判定
  71. @Test
  72. public void testField6(){
  73. LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
  74. lqw.select(User::getUserId,User::getUserName,User::getPassword);
  75. lqw.eq(User::getUserName ,"Tom").eq(User::getPassword,"tom");
  76. //使用 selectMaps 将查询的字段作为键名 , 查询的结果作为值
  77. User user = userDao.selectOne(lqw);
  78. System.out.println(user);
  79. }
  80. //todo 范围查询
  81. @Test
  82. public void testField7(){
  83. LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
  84. lqw.select(User::getUserId,User::getUserName,User::getPassword,User::getUserAge);
  85. lqw.between(User::getUserAge,20,45);
  86. //使用 selectMaps 将查询的字段作为键名 , 查询的结果作为值
  87. List<User> users = userDao.selectList(lqw);
  88. users.forEach(user -> System.out.println(user));
  89. }
  90. // todo 排序查询
  91. @Test
  92. public void testField8(){
  93. QueryWrapper<User> qw = new QueryWrapper<>();
  94. qw.select("user_name","user_pwd","user_tel","user_age");
  95. qw.groupBy("user_age");
  96. List<Map<String, Object>> maps = userDao.selectMaps(qw);
  97. System.out.println(maps);
  98. }
  99. }

3、查询条件

  1. package xyz.zhouge.dao;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import org.junit.jupiter.api.Test;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.boot.test.context.SpringBootTest;
  7. import xyz.zhouge.pojo.User;
  8. import java.util.List;
  9. import java.util.Map;
  10. @SpringBootTest
  11. public class UserDaoTest {
  12. @Autowired
  13. private UserDao userDao ;
  14. @Test
  15. public void testField(){
  16. LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
  17. List<User> users = userDao.selectList(lqw);
  18. users.forEach(user -> System.out.println(user));
  19. }
  20. @Test
  21. public void testField1(){
  22. LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
  23. //指定需要查询的字段 LambdaQueryWrapper 可以用 Lambda 来表示
  24. lqw.select(User::getUserId,User::getUserName,User::getUserTel);
  25. List<User> users = userDao.selectList(lqw);
  26. users.forEach(user -> System.out.println(user));
  27. }
  28. @Test
  29. public void testField2(){
  30. QueryWrapper<User> qw = new QueryWrapper<>();
  31. //指定需要查询的字段 QueryWrapper 只能使用字符串来表示
  32. qw.select("user_id","user_name","user_tel");
  33. List<User> users = userDao.selectList(qw);
  34. users.forEach(user -> System.out.println(user));
  35. }
  36. @Test
  37. public void testField3(){
  38. QueryWrapper<User> qw = new QueryWrapper<>();
  39. //指定需要查询的字段 不能使用 LambdaQueryWrapper
  40. //qw.select("avg(user_age)");
  41. //qw.select("max(user_age)");
  42. qw.select("count(*) as count");
  43. //使用 selectMaps 将查询的字段作为键名 , 查询的结果作为值
  44. List<Map<String, Object>> maps = userDao.selectMaps(qw);
  45. maps.forEach(map -> System.out.println(map));
  46. }
  47. //todo 分组查询
  48. @Test
  49. public void testField4(){
  50. QueryWrapper<User> qw = new QueryWrapper<>();
  51. //指定需要查询的字段 不能使用 LambdaQueryWrapper
  52. qw.select("count(*) as count,user_tel");
  53. //qw.groupBy("user_tel");
  54. //使用 selectMaps 将查询的字段作为键名 , 查询的结果作为值
  55. List<Map<String, Object>> maps = userDao.selectMaps(qw);
  56. maps.forEach(map -> System.out.println(map));
  57. }
  58. //todo 模糊查询
  59. @Test
  60. public void testField5(){
  61. LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
  62. lqw.select(User::getUserId,User::getUserName,User::getPassword);
  63. //lqw.like(User::getUserName,"tom");
  64. //lqw.likeLeft(User::getUserName,"om");
  65. //lqw.likeRight(User::getUserName,"T");
  66. //使用 selectMaps 将查询的字段作为键名 , 查询的结果作为值
  67. List<Map<String, Object>> maps = userDao.selectMaps(lqw);
  68. maps.forEach(map -> System.out.println(map));
  69. }
  70. //todo 等值判定
  71. @Test
  72. public void testField6(){
  73. LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
  74. lqw.select(User::getUserId,User::getUserName,User::getPassword);
  75. lqw.eq(User::getUserName ,"Tom").eq(User::getPassword,"tom");
  76. //使用 selectMaps 将查询的字段作为键名 , 查询的结果作为值
  77. User user = userDao.selectOne(lqw);
  78. System.out.println(user);
  79. }
  80. //todo 范围查询
  81. @Test
  82. public void testField7(){
  83. LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
  84. lqw.select(User::getUserId,User::getUserName,User::getPassword,User::getUserAge);
  85. lqw.between(User::getUserAge,20,45);
  86. //使用 selectMaps 将查询的字段作为键名 , 查询的结果作为值
  87. List<User> users = userDao.selectList(lqw);
  88. users.forEach(user -> System.out.println(user));
  89. }
  90. // todo 排序查询
  91. @Test
  92. public void testField8(){
  93. QueryWrapper<User> qw = new QueryWrapper<>();
  94. qw.select("user_name","user_pwd","user_tel","user_age");
  95. qw.groupBy("user_age");
  96. List<Map<String, Object>> maps = userDao.selectMaps(qw);
  97. System.out.println(maps);
  98. }
  99. }

4、映射匹配兼容性

四、DML编程控制

1、id生成策略控制

名称 @TableId
类型 属性注解
位置 模型类中用于表示主键的属性定义上方
作用 模型类中用于表示主键的属性定义上方
相关属性 value(默认):设置数据库表主键名称
type:设置主键属性的生成策略,值查照IdType的枚举值
type AUTO , INPUT ,ASSIGN_ID,ASSIGN_UUID

2、多记录操作

3、逻辑删除

3.1在数据库表中添加逻辑删除字段

image.png

  1. ALTER TABLE tb_user ADD `user_deleted` int(1) DEFAULT 0 ;

3.2在实体类中添加逻辑删除字段属性

  1. package xyz.zhouge.pojo;
  2. import com.baomidou.mybatisplus.annotation.IdType;
  3. import com.baomidou.mybatisplus.annotation.TableField;
  4. import com.baomidou.mybatisplus.annotation.TableId;
  5. import com.baomidou.mybatisplus.annotation.TableLogic;
  6. import com.baomidou.mybatisplus.annotation.TableName;
  7. import com.baomidou.mybatisplus.annotation.Version;
  8. import lombok.AllArgsConstructor;
  9. import lombok.Data;
  10. import lombok.NoArgsConstructor;
  11. @AllArgsConstructor
  12. @NoArgsConstructor
  13. @Data
  14. @TableName("tb_user")
  15. public class User {
  16. @TableId(value = "user_id" ,type = IdType.ASSIGN_ID)
  17. private long userId ;
  18. @TableField("user_name")
  19. private String userName ;
  20. @TableField("user_pwd")
  21. private String password ;
  22. @TableField("user_age")
  23. private Integer userAge ;
  24. @TableField("user_tel")
  25. private String userTel ;
  26. // value 为默认值,即可被查询出来的值。deval为被删除的值
  27. @TableField("user_deleted")
  28. @TableLogic(value = "0" ,delval = "1")
  29. private Integer userDeleted ;
  30. @TableField("user_version")
  31. @Version
  32. private Integer userVersion ;
  33. public User(String userName, String password, Integer userAge, String userTel) {
  34. this.userName = userName;
  35. this.password = password;
  36. this.userAge = userAge;
  37. this.userTel = userTel;
  38. }
  39. public User(long userId, String userName, String password, Integer userAge, String userTel) {
  40. this.userId = userId;
  41. this.userName = userName;
  42. this.password = password;
  43. this.userAge = userAge;
  44. this.userTel = userTel;
  45. }
  46. public User(long userId, String userName, String password, Integer userAge, String userTel, Integer userVersion) {
  47. this.userId = userId;
  48. this.userName = userName;
  49. this.password = password;
  50. this.userAge = userAge;
  51. this.userTel = userTel;
  52. this.userVersion = userVersion;
  53. }
  54. }

3.3在属性上添加 @TableLogic()注解

// value 为默认值,即可被查询出来的值。deval为被删除的值
@TableLogic(value = “0” ,delval = “1”)

3.4测试

4、乐观锁

4.1在数据库表中添加乐观锁字段

MyBatis-Plus快速版(SpringBoot版) - 图5

  1. ALTER TABLE tb_user ADD `user_version` int(10) DEFAULT 1

4.2在实体类中添加乐观锁属性

  1. package xyz.zhouge.pojo;
  2. import com.baomidou.mybatisplus.annotation.IdType;
  3. import com.baomidou.mybatisplus.annotation.TableField;
  4. import com.baomidou.mybatisplus.annotation.TableId;
  5. import com.baomidou.mybatisplus.annotation.TableLogic;
  6. import com.baomidou.mybatisplus.annotation.TableName;
  7. import com.baomidou.mybatisplus.annotation.Version;
  8. import lombok.AllArgsConstructor;
  9. import lombok.Data;
  10. import lombok.NoArgsConstructor;
  11. @AllArgsConstructor
  12. @NoArgsConstructor
  13. @Data
  14. @TableName("tb_user")
  15. public class User {
  16. @TableId(value = "user_id" ,type = IdType.ASSIGN_ID)
  17. private long userId ;
  18. @TableField("user_name")
  19. private String userName ;
  20. @TableField("user_pwd")
  21. private String password ;
  22. @TableField("user_age")
  23. private Integer userAge ;
  24. @TableField("user_tel")
  25. private String userTel ;
  26. // value 为默认值,即可被查询出来的值。deval为被删除的值
  27. @TableField("user_deleted")
  28. @TableLogic(value = "0" ,delval = "1")
  29. private Integer userDeleted ;
  30. @TableField("user_version")
  31. @Version
  32. private Integer userVersion ;
  33. public User(String userName, String password, Integer userAge, String userTel) {
  34. this.userName = userName;
  35. this.password = password;
  36. this.userAge = userAge;
  37. this.userTel = userTel;
  38. }
  39. public User(long userId, String userName, String password, Integer userAge, String userTel) {
  40. this.userId = userId;
  41. this.userName = userName;
  42. this.password = password;
  43. this.userAge = userAge;
  44. this.userTel = userTel;
  45. }
  46. public User(long userId, String userName, String password, Integer userAge, String userTel, Integer userVersion) {
  47. this.userId = userId;
  48. this.userName = userName;
  49. this.password = password;
  50. this.userAge = userAge;
  51. this.userTel = userTel;
  52. this.userVersion = userVersion;
  53. }
  54. }

4.3在字段上添加@Version

@TableField(“user_version”)
@Version
private Integer userVersion ;

4.4添加乐观锁拦截器

  1. package xyz.zhouge.config;
  2. import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
  3. import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
  4. import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. @Configuration
  8. public class VersionInterceptor {
  9. @Bean
  10. public MybatisPlusInterceptor interceptor(){
  11. //1, 创建一个通用的拦截器
  12. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  13. //2,指定(添加) 特定的拦截器 分页拦截器
  14. interceptor.addInnerInterceptor(new PaginationInnerInterceptor());//添加分页拦截器
  15. interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());//添加乐观锁拦截器
  16. //3,返回拦截器
  17. return interceptor;
  18. }
  19. }

4.5测试

五、快速开发

1、代码生成器原理分析

2、代码生成器实现

2.1导入maven依赖

  1. <dependencies>
  2. <!--mybatis-plus-->
  3. <dependency>
  4. <groupId>com.baomidou</groupId>
  5. <artifactId>mybatis-plus-boot-starter</artifactId>
  6. <version>3.4.1</version>
  7. </dependency>
  8. <!--lombok-->
  9. <dependency>
  10. <groupId>org.projectlombok</groupId>
  11. <artifactId>lombok</artifactId>
  12. <version>1.18.12</version>
  13. </dependency>
  14. <!--druid-->
  15. <dependency>
  16. <groupId>com.alibaba</groupId>
  17. <artifactId>druid</artifactId>
  18. <version>1.1.10</version>
  19. </dependency>
  20. <!--mybatis-plus-generator-->
  21. <dependency>
  22. <groupId>com.baomidou</groupId>
  23. <artifactId>mybatis-plus-generator</artifactId>
  24. <version>3.4.1</version>
  25. </dependency>
  26. <!--模板引擎-->
  27. <dependency>
  28. <groupId>org.apache.velocity</groupId>
  29. <artifactId>velocity</artifactId>
  30. <version>1.5</version>
  31. </dependency>
  32. </dependencies>

2.2编写引导类

2.3创建代码生成器类

  1. package xyz.zhouge.generator;
  2. import com.baomidou.mybatisplus.annotation.IdType;
  3. import com.baomidou.mybatisplus.generator.AutoGenerator;
  4. import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
  5. import com.baomidou.mybatisplus.generator.config.GlobalConfig;
  6. import com.baomidou.mybatisplus.generator.config.PackageConfig;
  7. import com.baomidou.mybatisplus.generator.config.StrategyConfig;
  8. /**
  9. * MybatisPlus 代码生成器
  10. */
  11. public class CodeGenerator {
  12. public static void main(String[] args) {
  13. try {
  14. //创建代码生成器对象
  15. AutoGenerator generator = new AutoGenerator();
  16. //设置数据库相关配置
  17. DataSourceConfig dataSourceConfig = new DataSourceConfig();
  18. dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
  19. dataSourceConfig.setUrl("jdbc:mysql://zhouge.xyz/db_mybatisplus");
  20. dataSourceConfig.setUsername("admin");
  21. dataSourceConfig.setPassword("991227zg@.");
  22. generator.setDataSource(dataSourceConfig);//将数据库配置添加到代码生成器中
  23. //设置全局配置
  24. GlobalConfig globalConfig = new GlobalConfig();
  25. globalConfig.setOutputDir(System.getProperty("user.dir")+"/demo6-generator/src/main/java");//设置代码 位置
  26. globalConfig.setOpen(true);//设置生成完代码之后,是否打开文件管理器
  27. globalConfig.setAuthor("周葛");//设置作者
  28. globalConfig.setFileOverride(true);//设置是否覆盖原文件
  29. globalConfig.setMapperName("%sDao");//设置数据访问层接口名字 %s 为占位符
  30. globalConfig.setIdType(IdType.ASSIGN_ID);//设置id生成方案
  31. generator.setGlobalConfig(globalConfig);
  32. //设置包名相关配置
  33. PackageConfig packageConfig = new PackageConfig();
  34. packageConfig.setParent("xyz.zhouge.demo");//设置生成的包名
  35. packageConfig.setEntity("pojo");//设置实体类的包名
  36. packageConfig.setMapper("dao");//设置数据访问层包名
  37. packageConfig.setController("controller");//设置控制层包名
  38. packageConfig.setService("service");
  39. generator.setPackageInfo(packageConfig);
  40. //策略配置
  41. StrategyConfig strategyConfig = new StrategyConfig();
  42. strategyConfig.setInclude("tb_user");//设置需要生成的表明,是一个可变参数,可以写多个表名
  43. strategyConfig.setTablePrefix("tb_");//设置数据表表前缀
  44. strategyConfig.setRestControllerStyle(true);//设置是否启用REST风格
  45. strategyConfig.setVersionFieldName("user_version");//设置乐观锁字段名
  46. strategyConfig.setLogicDeleteFieldName("user_deleted");//设置逻辑删除字段名
  47. strategyConfig.setEntityLombokModel(true);//设置是否启用lombok
  48. generator.setStrategy(strategyConfig);
  49. //执行代码生成器
  50. generator.execute();
  51. } catch (Exception e) {
  52. e.printStackTrace();
  53. }
  54. }
  55. }

2.4运行程序

3、MP中Service的CRUD