MyBatisplus

本文介绍了MyBatisPlus的集成步骤,包括数据库配置、依赖引入、MapperScan注解等,并详细讲解了其核心功能,如DQL编程控制、分页功能、Lombok插件的使用。MyBatisPlus提供了丰富的操作API,简化了单表的CRUD操作,并支持Lambda表达式和主键自增。同时,通过拦截器实现分页查询,使用Page对象方便地获取查询结果及分页信息。

MyBatisplus集成步骤

技术集:MySQL Driver
1、数据库
2、引入pom依赖:mysql-connector-java、lombok(非必须)、mybatis-plus-boot-starter
3、application文件配置spring.datasource 数据源(如果需要使用Druid数据源,导入对应坐标)
4、可选:application.yml文件配置 mybatis-plus 参数:如主键自增、表前缀、打印sql日志

# dataSource
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springtest_db?serverTimezone=UTC
    username: root
    password: root
#禁用banner
  main:
    banner-mode: off
# mp日志
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#禁用banner  
  global-config:
    banner: false
    db-config:
      #id策略
  # 1)、 AUTO:自增(代码和数据库都需要指定)
  #	2)、 INPUT :用户自己输入
  #	3)、 ASSIGN_ID:64位雪花算法(默认)
  #	4)、 ASSIGN_UUID:UUID
      id-type: assign_id
      #表前缀
      table-prefix: tbl_
      # 逻辑删除字段名
      logic-delete-field: deleted
      # 逻辑删除字面值:未删除为0
      logic-not-delete-value: 0
      # 逻辑删除字面值:删除为1
      logic-delete-value: 1


5、集成代码生成:引入pom依赖 mybatis-plus-generator、velocity或freemarker
6、自动生成代码,将代码拷贝至相应位置
7、启动类增加 @MapperScan(“com.adolesce.common.mapper”) 注解,扫描mapper接口
8、编写MybatisPlusPageConfig配置类,加载mybatis_plus分页插件(加载这个插件了分页才有效果)
9、测试使用
2.0版本与3.0版本 API不一样

Mybatis概述

  • 针对mybatis的增强的工具,特点是:无侵入、轻量级,原则是只做增强,不做修改。
  • 针对于单表的CRUD,我们不用自己写SQL,它已经为我们提供好了一切单表所需的API
  • 支持 Lambda:编写查询条件无需担心字段写错
  • 支持主键自动生成
  • 内置分页插件

相关操作

在这里插入图片描述

  • 根据ID批量删:
    int deleteBatchIds(@Param(“coll”) Collection<? extends Serializable> idList);

  • 根据条件删
    int deleteByMap(@Param(“cm”) Map<String, Object> columnMap);
    int delete(@Param(“ew”) Wrapper queryWrapper);

  • 根据ID修改
    int updateById(@Param(“et”) T entity);

  • 根据条件修改
    int update(@Param(“et”) T entity, @Param(“ew”) Wrapper updateWrapper);

  • 根据ID批量查
    List selectBatchIds(@Param(“coll”) Collection<? extends Serializable> idList);

  • 查询结果集条数
    Integer selectCount(@Param(“ew”) Wrapper queryWrapper);

  • 根据条件查
    T selectOne(@Param(“ew”) Wrapper queryWrapper);
    List selectByMap(@Param(“cm”) Map<String, Object> columnMap);
    List selectList(@Param(“ew”) Wrapper queryWrapper);
    List<Map<String, Object>> selectMaps(@Param(“ew”) Wrapper queryWrapper);
    List selectObjs(@Param(“ew”) Wrapper queryWrapper);

Lombok插件

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
</dependency>
  1. 生成getter和setter方法:@Getter、@Setter
    生成toString方法:@ToString
    生成equals和hashcode方法:@EqualsAndHashCode
  2. 统一成以上所有:@Data
  3. 生成空参构造: @NoArgsConstructor
    生成全参构造: @AllArgsConstructor

分页功能

原理:在发起SQL查询前,通过mybatis拦截器,对SQL进行增强,根据分页的设置,自动拼接上limit语句。

//设置分页拦截器作为Spring管理的bean
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 MybatisPlusConfig {}
//3.4.0以前这么配
	@Bean
	public PaginationInterceptor paginationInterceptor(){
		return  new PaginationInterceptor();
	}

//	3.4.0以后这么配
	@Bean
	public MybatisPlusInterceptor mpInterceptor(){
	//1.定义Mp拦截器
		MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
	//2.添加具体的拦截器
		mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
		return mpInterceptor;
	}

page对象作为查询条件传进去以后,查询结束后会将结果集也封装到page对象中,最后返回这个对象。参数和返回值是同一个对象。

//分页查询
@Test
void testSelectPage(){
    //1 创建IPage分页对象,设置分页参数
    IPage<User> page=new Page<>(1,3);
    //2 执行分页查询
    userDao.selectPage(page,null);
    //3 获取分页结果
    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());
}

DQL编程控制

在这里插入图片描述

  • 按条件查询
//方式一:按条件查询
QueryWrapper<User> qw=new QueryWrapper<>();
qw.lt("age", 18);
List<User> userList = userDao.selectList(qw);
System.out.println(userList);

//方式二:lambda格式按条件查询
QueryWrapper<User> qw = new QueryWrapper<User>();
qw.lambda().lt(User::getAge, 10);
List<User> userList = userDao.selectList(qw);
System.out.println(userList);

//方式三:lambda格式按条件查询
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
lqw.lt(User::getAge, 10);
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);


//方式四:lambda格式按条件查询
  LambdaQueryWrapper<User> wrapper = Wrappers.<User>lambdaQuery().lt(User::getAge, 10);
    List<User> userList = userDao.selectList(wrapper);
    System.out.println(userList);
	
//方式五:service 进行查询
userService.lambdaQuery().lt(User::getAge, 30).gt(User::getAge, 10).list();
	
  • 组合条件
//并且关系
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//并且关系:10到30岁之间
lqw.lt(User::getAge, 30).gt(User::getAge, 10);
List<User> userList = userDao.selectList(lqw);

//或者关系
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//或者关系:小于10岁或者大于30岁
lqw.lt(User::getAge, 10).or().gt(User::getAge, 30);
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
  • NULL值处理
    多条件查询中,有条件的值为空,通过设置查询条件的第一个参数condition决定是否追加该查询条件
//1、if
//(略)

//2、条件参数控制
Integer minAge=10;  //将来有用户传递进来,此处简化成直接定义变量了
Integer maxAge=null;  //将来有用户传递进来,此处简化成直接定义变量了
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//参数1:如果表达式为true,那么查询才使用该条件
lqw.gt(minAge!=null,User::getAge, minAge);
lqw.lt(maxAge!=null,User::getAge, maxAge);
List<User> userList = userDao.selectList(lqw);
userList.forEach(System.out::println);

//3、2的链式编程

//参数1:如果表达式为true,那么查询才使用该条件
lqw.gt(minAge!=null,User::getAge, minAge)
   .lt(maxAge!=null,User::getAge, maxAge);

查询投影

设置需要进行查询的列,列需要进行聚合

查询结果包含模型类中部分属性

  • lqw.select(User::getId, User::getName, User::getAge);
  • lqw.select(“id”, “name”, “age”, “tel”);

查询结果包含模型类中未定义的属性

  • lqw.select(“count(*) as count, tel”);
    lqw.groupBy(“tel”);
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值