资讯详情

MyBatis-Plus(详解)

在这里插入图片描述

??博客主页:不会弯曲的小飞侠 ?欢迎关注,点赞收藏留言 ?系列专栏:MyBatis-Plus专栏 ?假如博主的文章还不错,请三连支持博主。 ??欢迎大佬指正,一起 学习!一起加油!

目录

  • ??MyBatisPlus简介
  • ??MyBatisPlus快速入门案例
  • ??开发标准数据层
    • ??MP接口
    • ?? id查询
    • ??修改
    • ??删除
    • ??保存
    • ??分页
    • ??开启日志
  • ??DQL控制
    • ??条件查询
      • ??方法一是按条件查询
      • ??方式二:lambda根据条件查询格式
      • ??方式三:lambda根据条件查询格式
    • ??并且and
    • ??或者or
    • ??条件查询—null值处理
    • ??查询投影
    • ?? 分组统计
    • ?? 查询条件
    • ?? 范围查询
    • ?? 字段映射和表示映射
  • ??DML控制
    • ??id生成策越
    • ??多数据操作(删除)
    • ??多数据操作(查询)
    • ??逻辑删除
    • ??乐观


??MyBatisPlus简介

  • MyBatisPlus(简称MP)是基于MyBatis以框架为基础的增强工具旨在简化开发,提高效率。

  • 开发方式

    • 基于MyBatis使用MyBatisPlus
    • 基于Spring使用MyBatisPlus
    • 基于SpringBoot使用MyBatisPlus

??MyBatisPlus快速入门案例

  • 本案例采用SpringBoot整合MyBatis开发
  • 创建SpringBoot工程
  1. 这里没有描述太多的创建过程,详细的过程是Springboot点击专栏直接查看
  2. 勾选配置中使用的技术

  1. 手动添加MP依赖:
        <dependency>    <groupId>com.baomidou</groupId>    <artifactId>mybatis-plus-boot-starter</artifactId>    <version>3.4.1</version>   </dependency> 

???注意:可以直接勾选阿里云版MyBatisPlus

  1. 设置dataSource相关属性(JDBC参数)
spring:   datasource:     driver-class-name=com: com.mysql.cj.jdbc.Driver     url: jdbc:mysql://localhost:3306/mybatisplus?serverTimezone=UTC     username: root     password: root     type: com.alibabadruid.pool.DruidDataSource mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 

使用Druid数据源,需要导入坐标:

	<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.2.11</version>
		</dependency>
  1. 创建实体类(User)
package com.jkj.domain;
import lombok.Data;
@Data
public class User { 
        
    private Long id;
    private String name;
    private String password;
    private Integer age;
    private String tel;
}

  1. 创建表结构

  1. 定义数据接口继承BaseMapper
package com.jkj.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jkj.domain.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserDao extends BaseMapper<User> { 
        
}

  1. 创建测试类
@SpringBootTest
class Mybatisplus01ApplicationTests { 
        

	@Autowired
	private UserDao userDao;
	@Test
	void findAll(){ 
        
		
		List<User> users = userDao.selectList(null);
		System.out.println(users);
       }
  }

  • 测试

🍁标准数据层开发

🔥MP接口

  • 新增:int insert(T t)
  • 删除:int deleteById(Serializable id)
  • 修改:int updateById(T t)
  • id查询:T selectById(Serializable id)
  • 查询全部:List<T> selectList()
  • 分页查询:IPage<T> selectPage( IPage<T> page)
  • 条件查询:Page<T> selectPage(Wrapper<T> querywrapper)

🔥 id查询

   @Test
    void findById(){ 
        
        User user = userDao.selectById(3L);
        System.out.println(user);
    }

测试:

🔥修改

@Test
    void updateById(){ 
        
        User user=new User();
        user.setId(2L);
        user.setName("老二");
        user.setTel("212121");
       userDao.updateById(user);
    }

测试:

🔥删除

   @Test
    void deleteById(){ 
        
        userDao.deleteById(4L);
    }

测试:

🔥保存

   @Test
    void save(){ 
        
        User user=new User();
        user.setId(4L);
        user.setName("老四");
        user.setPassword("444");
        user.setAge(67);
        user.setTel("555222");
        userDao.insert(user);
    }

测试:

🔥分页

  1. 设置分页拦截器作为Spring管理的bean
package com.jkj.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MpConfig { 
        
   @Bean
   //设置分页拦截器
    public MybatisPlusInterceptor pageInterceptor(){ 
        
       //定义MP拦截器
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //添加具体的拦截器
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}
  1. 执行分页查询
  @Test
    void selectPage(){ 
        
        IPage page = new Page(1, 2);
        userDao.selectPage(page,null);
        System.out.println("当前页码"+page.getCurrent());
        System.out.println("每页数据总量"+page.getSize());
        System.out.println("总页数"+page.getPages());
        System.out.println("数据总量"+page.getTotal());
        System.out.println("当前页数据"+page.getRecords());

    }

测试:

🔥开启日志

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

🍁DQL控制

  • MyBatisPlus将书写复杂的sQL查询条件进行了封装,使用编程的形式完成查询条件的组合。
    • selectOneWrapper):T
    • selectCountWrapper): Integer
    • selectListWrapper): List
    • selectMapsWrapper): List<Map<String, Object> >
    • selectObjsWrapper): List
    • selectPage(IPage,Wrapper): IPage
    • selectMapsPage(IPage,Wrapper): lPage<Map<String, Object>>

🔥条件查询

🔥方式一按条件查询

		QueryWrapper qw = new QueryWrapper();
		qw.lt("age",20);
		List<User> users = userDao.selectList(qw);
		System.out.println(users);

🔥方式二:lambda格式按条件查询

		QueryWrapper<User> qw = new QueryWrapper<User>();
		qw.lambda().lt(User::getAge,20);
		List<User> users = userDao.selectList(qw);
		System.out.println(users);

🔥方式三:lambda格式按条件查询

		LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
		lqw.lt(User::getAge,20);
		List<User> users = userDao.selectList(lqw);
		System.out.println(users);

测试:

🔥并且and

  • 年龄大于20小于35
		LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
		lqw.lt(User::getAge,35).gt(User::getAge,20);
		List<User> users = userDao.selectList(lqw);
		System.out.println(users);

测试:

🔥或者or

  • 小于20大于35
		LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
		lqw.lt(User::getAge,20).or().gt(User::getAge,35);
		List<User> users = userDao.selectList(lqw);
		System.out.println(users);

测试:

🔥条件查询—null值处理

  • if语句控制条件追加
        LambdaQuerywrapper<User> lqw = new LambdaQuerywrapper<User>();
        if(null != userQuery.getAge()(
                  lqwn .ge(User::getAge,userQuery.getAge());
                   }
        if(null != userQuery.getAge2()){ 
        
                   lqw .lt(User::getAge,userQuery.getAge2());
                   }
        List<User> userList = userDao.selectList(lqw);
        System.out.print1n(userList);

  • 条件参数控制
        LambdaQuerywrapper<User> lqw = new LambdaQuerywrapper<User>();
        lqw.ge(null != userQuery.getAge(),User::getAge,userQuery.getAge());
        lqw.1t(null != userQuery.getAge2( ),User::getAge,userQuery.getAge2());
        List<User> userList = userDao.selectList( 1qw ) ;
        System.out.println(userList);
  • 条件参数控制(链式编程)
        LambdaQuerywrapper<User> lqw = new LambdaQuerywrapper<User>();
        lqw.ge(null != userQuery.getAge(),User::getAge,userQuery.getAge())
        .1t(null != userQuery.getAge2( ),user::getAge,userQuery.getAge2());
        List<User> userList = userDao.selectList( 1qw ) ;
        System.out.println(userList);

🔥查询投影

  • 查询结果包含模型类中部分属性
        //查询投影(方式一)
		LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
		lqw.select(User::getId,User::getName,User::getAge);
		List<User> users = userDao.selectList(lqw);
		System.out.println(users);

		//查询投影(方式二)
		QueryWrapper qw = new QueryWrapper();
		qw.select("id","name","age");
		List<User> users = userDao.selectList(qw);
		System.out.println(users);

测试:

🔥 分组统计

		QueryWrapper qw = new QueryWrapper();
		qw.select("count(*) as count","tel");
		qw.groupBy("tel");
		List<Map<String,Object>> list = userDao.selectMaps(qw);
		System.out.println(list);

测试:

🔥 查询条件

  • 查询条件
    • 范围匹配(> = between )
    • 模糊匹配( like)
    • 空判定(null)
    • 包含性匹配 ( in )
    • 分组( group)
    • 排序( order) …
  • 模拟用户登录
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
		lqw.eq(User::getName,"老二").eq(User::getPassword,"222");
		User user = userDao.selectOne(lqw);
		System.out.println(user);

测试:

🔥 范围查询

        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
		lqw.between(User::getAge,10,35);
		List<User> users = userDao.selectList(lqw);
		System.out.println(users);

测试:

🔥 字段映射与表明映射

  • 当实体类属性和字段不一致时
    • @TableField
    • 属性注解
    • 设置当前属性对应的数据库表中的字段关系
    • value (默认〕:设置数据库表字段名称
@TableField(value = "psw")
    private String password;
  • 编码中添加了数据库中未定义的属性
  • exist:设置属性在数据表字段中是否存在,默认是true
@TableField(exist = false)
    private String address;
  • 查询字段的权限
  • select: 设置属性是否参与查询
 @TableField(value = "psw",select = false)
    private String password;
  • 表名与实体类名不一致
  • @TableName
  • 类注解
  • 设置当前类对应数据库表关系
@TableName("xfx_user")
public class User { 
        
}
  • 在配置中解决表名与实体类名不一致的问题
mybatis-plus:
  global-config:
    db-config:
      id-type: auto
      table-prefix: xfx

🍁DML控制

🔥id生成策越

  • 名称:@TableId
  • 类型:属性注解
  • 位置:模型类中用于表示主键的属性定义上方
  • 作用:设置当前类中主键属性的生成策略
  • 相关属性
    • value:设置数据库主键名称
    • type:设置主键属性的生成策略,值参照IdType枚举值
    • AUTO(0):使用数据库id自增策略控制id生成
    • NONE(1):不设置id生成策略
    • INPUT(2):用户手工输入id
    • ASSIGN_ID(3):雪花算法生成id(可兼容数值型与字符串型)
    • ASSIGN_UUID(4):以UUID生成算法作为id生成策略
 @TableId(type = IdType.AUTO)
    private Integer id;

测试:

    @Test
	void save(){ 
        
		User use

标签: 3l光点长距离高精度稳定传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台