1.MyBatis-Plus是什么?
官方是这样定义的:
Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
所谓的增强,就是已经封装好了一些crud(增删改查),不用再写mapper.xml,可以直接调用它的方法即可,如以下方法:
2.为什么要用MyBatis-Plus?
优点:
- 效率提高了,因为基本的CRUD写好了
- 支持Lambda形式调用,不用担心字段写错而引起的异常
- 支持主键自动生成
- 内置分页插件
- 基于mybatis做增强而已
- SQL语句自由控制,较为灵活
- 提供动态SQL语句,可以根据需求灵活控制SQL与业务代码分离,易于阅读
- 提供功能丰富的条件构造器快速进行无sql开发
- 内置代码生成器,分页插件, 性能分析插件等
3.怎么用MyBatis-Plus?
需要注意的地方1:
(1)实体类中,如果使用了基本数据类型,就会导致在修改的时候,把原本不需要改动的数据也改动了,
因为原先的基本数据类型默认有值,所以他会默认set进去
(2)如果传入对象属性为nul,这些属性不参与sql拼接,也就不会set进去,因为他默认有判空机制
(3)如果是8个基本数据类型,有默认值,mybatis-plus认为是有值的,会拼接,也就会set进去
在讲下面的增删改查时,我们还需要了解下条件Wrapper特殊符号的意思,在下面的CRUD环节中会部分举例说明,
- ne-------------不等(not equal)
- eq---------等于
- gt----------大于
- lt----------小于
- ge-------大于等于
- le---------小于等于
- between----xxx之间(wrapper.between("age",18,20)查询年龄在18-20)
- notbetween---不在xxx之间
- isNull---------是空
- isNotNull-----不是空
- in-------wrapper.in("id",1L,2L)查id为1和2的,这里因为是布尔类型
- insql--------wrapper.insql("id","1,2")//sql片段
-
错误写法wrapper.insql("id","1L,2L"),错误原因是加了L就是java语法了,而不是sql语法
主食来了---->CRUD(增删改查)
开始操作之前需要准备一下操作,主要:建库建表->引以下依赖->配置application.properties连接数据
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
<scope>provided</scope>
</dependency>
</dependencies>
(1)添加
MP添加没有过多的操作,方法就是insert();(例子如下)
@Test
public void testSave(){
Employee employee = new Employee();
employee.setAdmin(true);
employee.setAge(18);
employee.setDeptId(1L);
employee.setEmail("EDC@123");
employee.setName("edc");
employee.setPassword("111");
employeeMapper.insert(employee);
}
(2)删除
MP删除的方法有这四个,分别是deleteById;delete;deleteBatchIds;deleteByMap,其中标黄的,在下方代码段中有举例,另外一个可以见名猜意,然后去实践一下;(例子如下)
@Test
public void testDelete(){
//最普通的根据id来删
employeeMapper.deleteById(1L);
System.out.println("------------------------------------------------------");
//根据指定的条件来删
LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();//创建条件构造器
wrapper.eq(Employee::getAdmin,true);//设置条件,条件是admin为true
wrapper.lt(5>4,Employee::getAge,10);//年龄小于10的
//此时的wrapper的条件是admin为true的并且年龄小于10
employeeMapper.delete(wrapper);
System.out.println("------------------------------------------------------");
//传集合进来来删
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
employeeMapper.deleteBatchIds(list);//删除该数组的元素
}
- 在上述代码中,条件删除的时候,有引用到"lt()",其中5>4为ture,只有满足这个条件才会加上,这个条件"年龄小于10岁",此时的wrapper条件是admin为true并且年龄小于10
- 如果前者条件为false,则不会加上"年龄小于10岁"这个条件,此时的wrapper条件就是admin为true的
(3)修改
MP修改有这两种,分别是updateById,update
@Test
public void testUpdate(){
//根据id修改
Employee employee = new Employee();
employee.setId(3L);
employee.setAdmin(true);
employee.setAge(18);
employee.setDeptId(1L);
employee.setEmail("alun@123.cn");
employee.setName("edc");
employee.setPassword("111");
employeeMapper.updateById(employee);
System.out.println("-------------------------------------------");
//条件修改
Employee employee1 = new Employee();
employee1.setEmail("alun@123.cn");
LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();//创建条件构造器
wrapper.ne(Employee::getAdmin,true);//设置条件,条件不等于true,那就是false囖
wrapper.ge(5>4,Employee::getAge,10);//年龄大于或等于10
employeeMapper.update(employee1 ,wrapper);
}
- 在上述代码中,条件删除的时候,有引用到"ge()",其中5>4为ture,只有满足这个条件才会加上,这个条件"年龄大于或等于10岁",此时的wrapper条件是admin为false并且年龄大于或等于10岁
- 如果前者条件为false,则不会加上"年龄小于10岁"这个条件,此时的wrapper条件就是admin为false的
(4)查询
MP查询有10种,分别是selectByMap,selectMaps,selectMapsPage,selectObjs,selecyPage,
selectById,selectList,selectBatchIds,selectCount,selectOne
@Test
public void testGet(){
//根据id来查
Employee employee = employeeMapper.selectById(1L);
System.out.println("------------------------------------------------------");
//查所有
List<Employee> list1 = employeeMapper.selectList(null);
System.out.println("------------------------------------------------------");
//根据集合查
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
List<Employee> employees = employeeMapper.selectBatchIds(list);
System.out.println("------------------------------------------------------");
//条件查询,返回满足条件的个数
LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();//创建条件构造器
wrapper.ne(Employee::getAdmin,true);//设置条件,条件是false的
wrapper.ge(Employee::getAge,10);//年龄大于或等于10
Integer integer = employeeMapper.selectCount(wrapper);
System.out.println("------------------------------------------------------");
//根据条件来查询
LambdaQueryWrapper<Employee> wrapper1 = new LambdaQueryWrapper<>();//创建条件构造器
wrapper1.eq(Employee::getAdmin,true)
.lt(5>4,Employee::getAge,10);//设置条件,条件是admin为true并且年龄小于10的
Employee employee1 = employeeMapper.selectOne(wrapper1);
}