在MybatisPlus官网的文档中分Mapper 即dao层的CRUD 和
Service层的CRUD 文档链接:mapper-crud-接口
另外官网推荐慕课网的视频教程链接:MybatisPlus从不会到熟练使用
下面是前提:
Mapper层 首先得定义一个 interface类去继承MybatisPlus的BaseMapper类
并且 指定一个泛型 (即 实体类 对应 数据库里的表)相当于这个接口是对这张表操作的。
例如:泛型User类,dao层的接口 UserMapper继承BaseMapper如下
User.java 类
import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; @Data // lombok的注解 自动生产 get、set、toString方法 public class User { @TableId //mybatisplus的主键注解 private long id; private String name; private long age; private String email; private long managerId; private java.sql.Timestamp createTime; }
UserMapper.java 接口类 泛型:就是 User类
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.mybatisplus.entity.User; @Mapper public interface UserMapper extends BaseMapper
{ } 另外注意:
mybatis-plus 提供了一些通用的查询方法比如通过 上面的UserMapper的实例对象调用,userMapper.
Wrapper是条件构造器,如果后面用到了学会用即可
使用方式都是通过接口的实体类调用例如
import com.example.mybatisplus.dao.UserMapper;
import com.example.mybatisplus.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
class MybatisplusApplicationTests {
@Autowired
UserMapper userMapper;
@Test
void test() {
List users = userMapper.selectList(null);//调用 selectList
System.out.println(users.toString());
}
}
下面的所有方法都是通过BaseMapper的继承接口userMapper的实例进行调用的
添加记录
int insert(T entity);
------返回插入成功的记录条数,需要传入一个实体类,这个实体类的属性要通过用户自己注入属性值,然后MP
(指MybatisPlus,后面全部用简称)会根据这个实体类的属性值 自动转换成SQL,然后会执行并且得到返回值。
根据主键删除记录----------关于主键,实体类必须加上@TableId主键表明该属性是主键
int deleteById(Serializable id);
------顾名思义,只需要传入主键值即可删除记录。同时返回删除记录的条数。
根据Map删除 相当于将Map转换成SQL的条件 对应这sql中的where条件
Map的key对应表中的列名,value对应列名对应的值
int deleteByMap(Map
map); -------Map的形式是key是数据库表字段名,value是值。对应上面的
例如:
@Test void test() { Map
map=new HashMap<>(); map.put("name","张雨琪");//可以添加多个字段,相当于条件 ‘与’ 的结果 int rows=userMapper.deleteByMap(map); System.out.println("删除了"+rows+"条记录"); }
根据条件构造器Wrapper方式删除int delete(Wrapper
wrapper); 下面是创建条件构造器和使用条件构造器
@Test void test() { LambdaQueryWrapper
lambdaQuery = Wrappers. lambdaQuery();// 创建一个条件构造器,下面使用,添加条件参数 lambdaQuery.eq(User::getName,"刘红雨").or().gt(User::getAge,41); // 姓名是留红雨,或者 年龄大于41的 int rows=userMapper.delete(lambdaQuery);//将条件构造器传入执行delete操作 System.out.println("删除条数"+rows); }
注意:这里的eq是equals条件构造器,具体可以去官网查看,都可以根据名称猜出意思条件构造器链接:https://mp.baomidou.com/guide/wrapper.html#eq
删除多条记录。这里用到了Java8的Collection API,实际上就是要传入一个列表而已
int deleteBatchIds(Collection extends Serializable> idList);
传入存有主键的列表,删除多条记录。注意sql语法以及外键约束等条件
例如:
@Test void test() { int rows=userMapper.deleteBatchIds(Arrays.asList(1094590409767661570L,1088250446457389058L)); System.out.println("删除了"+rows+"条记录"); }
根据主键更新记录-----主键值一定要通过entity的set方法设置,其它字段根据需求设置
int updateById(T entity);
-----该方法会根据entity的属性自动生成update语句,但是主键id必须给定。返回更新条数
举例:
@Test void test() { User user=new User(); user.setId(1094590409767661570L); user.setEmail("testUpdateById"); int rows = userMapper.updateById(user); System.out.println("更新了"+rows+"条"); }
根据条件构造器更新记录------创建条件构造器和之前的删除一样使用条件构造器int update(T entity,Wrapper
updateWrapper); 前面的一个参数传要更新的数据,后面传条件
@Test void test() { UpdateWrapper
updateWrapper=new UpdateWrapper<>(); updateWrapper.eq("name","李艺伟").eq("age",28); User user=new User(); user.setEmail("testUpdateWraper"); int rows = userMapper.update(user,updateWrapper); System.out.println("更新条数"+rows); } 当更新的字段比较少时可以用set设置跟新的数据 例如
@Test void test() { UpdateWrapper
updateWrapper=new UpdateWrapper<>(); updateWrapper.eq("name","李艺伟").eq("age",28).set("age",31); int rows = userMapper.update(null,updateWrapper); System.out.println("更新条数"+rows); } 使用Lambda表达式 有防误写功能
@Test void test() { LambdaUpdateWrapper
lambdaUpdate=Wrappers. lambdaUpdate(); lambdaUpdate.eq(User::getName,"李艺伟").eq(User::getId,1088250446457389058L) .set(User::getAge,32); int rows = userMapper.update(null,lambdaUpdate); System.out.println("更新条数"+rows); } 使用 链式Lambda表达式,特点一条语句完成
@Test void test() { boolean update = new LambdaUpdateChainWrapper
(userMapper).eq(User::getName, "李艺伟") .eq(User::getId, 1088250446457389058L).set(User::getAge, 30).update(); System.out.println("更新"+update); }
根据主键查询------注意在类属性的主键添加 @TableId注解
T selectById(Serializable id);
@Test void test() { User user = userMapper.selectById(1088250446457389058L); System.out.println(user.toString()); }
批量查询-------传入一个id的列表,返回与列表对应的 记录
List
selectBatchIds(Collection extends Serializable> idList); @Test void test() { List
ids=Arrays.asList(1088248166370832385L,1088250446457389058L,1094590409767661570L); List userList = userMapper.selectBatchIds(ids); userList.forEach(System.out::println); } 根据Map查询(map的key是数据库的列名,而value则是列名对应的值)
List
selectByMap(Map columnMap); @Test void test() { Map
map=new HashMap<>(); map.put("id",1094590409767661570L); map.put("name","张雨琪"); List userList = userMapper.selectByMap(map); userList.forEach(System.out::println); } 只返回一条记录,传入条件构造器,返回一条记录
T selectOne(Wrapper
queryWrapper); @Test void test() { QueryWrapper
queryWrapper=new QueryWrapper (); queryWrapper.likeRight("name", "张").lt("age", 41);// lessthan小于41、likeRight 张% User user = userMapper.selectOne(queryWrapper); System.out.println(user.toString()); } 返回满足条件的条数
Integer selectCount(Wrapper
queryWrapper); @Test void test() { QueryWrapper
queryWrapper=new QueryWrapper (); queryWrapper.lt("age", 31);// lessthan小于41 Integer rows = userMapper.selectCount(queryWrapper); System.out.println("小于31岁的有"+rows+"个"); } 返回满足条件的所有记录(通过条件构造器)
List
selectList(Wrapper queryWrapper); @Test void test() { QueryWrapper
queryWrapper=new QueryWrapper (); queryWrapper.lt("age", 31);// lessthan小于41 List userList = userMapper.selectList(queryWrapper); userList.forEach(System.out::println); } 返回Map类型的 所有满足条件的记录
List
@Test void test() { QueryWrapper
queryWrapper=new QueryWrapper (); queryWrapper.lt("age", 31);// lessthan小于41 List 返回Object类型的 所有满足条件的记录 注意:只返回第一个字段的值
List
分页查询
首先你得加一个插件进去,新建一个configuration包,在包里面建一个MybatisPlusConfig类
如下、 下面的注意作用是让springboot 托管插件 Paginationintercepter
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MyBatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor(){ return new PaginationInterceptor(); } }
然后就可以使用下面的方法进行分页查询
IPage
selectPage(IPage page, Wrapper queryWrapper); 示例代码:
@Test void test() { QueryWrapper
queryWrapper=new QueryWrapper (); queryWrapper.ge("age", 25);// greaterEquals大于等于25 Page page=new Page<>(1,2);//当前页是1,每页2条记录 IPage userIPage = userMapper.selectPage(page, queryWrapper); System.out.println("总页数"+userIPage.getPages()); System.out.println("总记录数数"+userIPage.getTotal()); List userList=userIPage.getRecords(); userList.forEach(System.out::println); } 示例结果展示:
分页查询二、返回Map类型的数据
IPage
@Test void test() { QueryWrapper
queryWrapper=new QueryWrapper (); queryWrapper.ge("age", 25);// greaterEquals大于等于25 Page page=new Page<>(1,1);//当前页是1,每页1条记录 IPage 结果展示、