MyBatisPlus实战-@TableField 注解的和基本CRUD使用

1,398 阅读4分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

@TableField 注解的基本使用

在MP中通过@TableField注解可以指定字段的一些属性,常见解决的问题有2种:

1、对象中的属性名和字段名不一致的问题(非驼峰)

2、对象中的属性字段在表中不存在的问题

使用场景1 字段错误

首先我们恶意修改把正确的email 改为mail 让它故意对不上

此时运行查询 会报错 原因就是因为匹配不到email字段

然后使用@TableField指定这个mail字段就是数据库里面的email字段

 //指定数据库字段名称
@TableField(value = "email" )

然后再次运行查询方法 这次正确了

同理 新增也是一样的 这里我们就直接设置mail的值 还是可以正常插入对应的email的值

使用场景2 不存在字段

这时我在是实体里面加入一个表里面不存在的字段

再次运行报错 找不到该字段

这时候怎么解决这个问题呢

通过@TableField(exist = false) 指名表里没有这个字段

@TableField(exist = false)

这个时候再次查询 发现解决了

使用场景3 不被查询的字段

如果有的字段数据比较隐私 不想被查出来怎么办呢?

我们可以使用

 // 查询的时候不返回该字段的值 默认为true(返回)
@TableField(select=false)

发现password的值已经被隐藏为null

更新操作

在MP中,更新操作有2种,一种是根据id更新,另一种是根据条件更新。

根据ID更新

 /**
* 测试MybatisPlus的修改操作之 根据ID进行修改
**/
@Test
public  void updateById(){
    User user = new User();
    // 根据ID进行修改
user.setId(1L);
    user.setAge(100);
    // 返回受影响的行数
 int i = userMapper.updateById(user);
    System.out.println( "受影响行数:" +i);
}

修改前

修改后 发现id为1的age已经被改成100了

根据条件更新

根据QueryWrapper更新
 /**
* 测试MybatisPlus的修改操作之 根据条件进行修改QueryWrapper
**/
@Test
public  void updateByEntityQueryWrapper(){
    User user = new User();
    user.setAge(1000);
    user.setPassword( "666666" );
    QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
    // 把用户名为zhangsan的数据进行更新
    userQueryWrapper.eq( "user_name" , "zhangsan" );
    // 返回受影响的行数
 int i = userMapper.update(user,userQueryWrapper);
    System.out.println( "受影响行数:" +i);
}

修改前

修改后

根据UpdateWrapper更新

写法1

 /**
* 测试MybatisPlus的修改操作之 根据条件进行修改UpdateWrapper
**/
@Test
public void updateByEntityUpdateWrapper(){
    User user = new User();
    user.setAge(1000);
    user.setPassword( "666666" );
    UpdateWrapper<User> userUpdateWrapper=new UpdateWrapper<>();
    // 把name为caocao的数据进行更新
userUpdateWrapper.eq( "name" , "caocao" );
    // 返回受影响的行数
 int i = userMapper.update(user,userUpdateWrapper);
    System.out.println( "受影响行数:" +i);
}

写法2

 /**
* 测试MybatisPlus的修改操作之 根据条件进行修改UpdateWrapper
**/
@Test
public void updateByEntityUpdateWrapper2(){

    UpdateWrapper<User> userUpdateWrapper=new UpdateWrapper<>();
    UpdateWrapper<User> eq = userUpdateWrapper.set( "age" , 88) //更新的内容
.set( "password" , "123456" ) //更新的内容
.eq( "id" , 1L); //更新的条件
// 返回受影响的行数
 int i = userMapper.update(null,userUpdateWrapper);
    System.out.println( "受影响行数:" +i);
}

删除操作

deleteById(根据ID删除 )

根据ID进行删除

这里我们删除ID为5的数据

 /**
* 测试MybatisPlus的操作之 删除操作 根据id删除
**/
@Test
public  void deleteUserById(){

    int i = userMapper.deleteById(5L);
    System.out.println( "受影响行数:" +i);
}

deleteByMap(根据map删除 )

可以把删除条件组装到map里面

 /**
* 测试MybatisPlus的操作之 删除操作 根据map删除
**/
@Test
public  void deleteUserByMap(){
    HashMap<String, Object> map = new HashMap();
    // 把删除条件封装到map里面 用and拼接
map.put( "id" ,1L);
    map.put( "user_name" , "zhangsan" );
    map.put( "password" , "123456" );
    int i = userMapper.deleteByMap(map);
    System.out.println( "受影响行数:" +i);
}

delete(根据实体删除 )

用法1 根据实体QueryWrapper删除

 /**
* 测试MybatisPlus的操作之 删除操作 根据实体QueryWrapper删除
**/
@Test
public  void deleteUserQueryWrapper(){
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq( "user_name" , "lisi" ).eq( "password" , "123456" );
    // 根据实体进行删除
 int i = userMapper.delete(queryWrapper);
    System.out.println( "受影响行数:" +i);
}

用法2 根据实体entity删除

 /**
* 测试MybatisPlus的操作之 删除操作 根据实体删除
**/
@Test
public void deleteUserEntity(){

    User user=new User();
    user.setPassword( "123456" );
    user.setUserName( "王青2" );
    // 组装好删除条件
QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
    int i = userMapper.delete(queryWrapper);
    System.out.println( "受影响行数:" +i);
}

deleteBatchIds(根据集合删除 批量删除 )

根据id批量删除

首先查看数据库 只有三条了 正好都删除完

 /**
* 测试MybatisPlus的操作之 删除操作 批量删除
**/
@Test
public  void deleteUserBatchIDs(){

    List<Long> ids = Arrays.asList(1L, 3L, 4L);
    int i = userMapper.deleteBatchIds(ids);
    System.out.println( "受影响行数:" +i);
}

查看数据库 已经删除完了

查询操作

MP提供了多种查询操作,包括根据id查询、批量查询、查询单条数据、查询列表、分页查询等操作。

接下来就要进行各种查询了 首先我们先造点数据

selectById (根据ID查询)

 /**
* 测试MybatisPlus的操作之 查询 根据ID查询
**/
@Test
public  void selectUserByID(){
    User user = userMapper.selectById(1L);
    System.out.println(user);
}

selectBatchIds(根据ID批量查询)

 /**
* 测试MybatisPlus的操作之 查询 根据ID批量查询
**/
@Test
public  void selectUserByBatchIDs(){
    List<Long> ids = Arrays.asList(1L, 2L, 3L);
    List<User> userList = userMapper.selectBatchIds(ids);
    for (User user : userList) {
        System.out.println(user);
    }

}

selectOne(查询一条数据)

查询出的数据大于1条的时候 会报错

 /**
* 测试MybatisPlus的操作之 查询 根据一条数据
**/
@Test
public void selectOnetUser(){
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    // 查询条件
queryWrapper.eq( "user_name" , "暗裔剑魔" );
    User user = userMapper.selectOne(queryWrapper);
    System.out.println(user);

}

如果查询出来的数据有多条会怎么样呢

会报错

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 8

selectCount(查询数据的条数)

 /**
* 测试MybatisPlus的操作之 查询 结果条数
**/
@Test
public void selecttUserCount(){
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    // 查询条件
queryWrapper.eq( "passworD" , "123456" );
    Integer integer = userMapper.selectCount(queryWrapper);
    System.out.println( "符合的结果数:" +integer);
}

查询年龄大于20的结果总数

 /**
* 测试MybatisPlus的操作之 查询 结果条数
**/
@Test
public void selectUserCount(){
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    // 查询条件
 // queryWrapper.eq("passworD", "123456");
 // 年龄大于 20
queryWrapper.gt( "age" ,20);
    Integer integer = userMapper.selectCount(queryWrapper);
    System.out.println( "符合的结果数:" +integer);
}

selectList(查询符合条件的全部的结果)

我们可以自定义设置条件

 /**
* 测试MybatisPlus的操作之 查询 全部结果
**/
@Test
public void selectUserList(){
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.like( "user_name" , "剑" );
    List<User> userList = userMapper.selectList(queryWrapper);
    for (User user : userList) {
        System.out.println(user);
    }
}

selectPage(分页查询)

首先需要配置分页拦截器(插件)

package com.wyh;

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
*  @description:  MP分页拦截器(插件)
*  @author:  魏一鹤
*  @createDate:  2022-08-29 22:03
**/

// 将想要的组件添加到容器中
@Configuration
public class MybatisPlusConfig {

    // 配置分页插件
@Bean
    public PaginationInterceptor paginationInterceptor(){
        return  new PaginationInterceptor();
    }
}

方法定义

 /**
* 测试MybatisPlus的操作之 查询 分页查询
**/
@Test
public void selectUserPage(){
    // 构造Page对象 查询第一页的第一条数据
Page<User> page = new Page<>(1,1);
    IPage<User> userIPage = userMapper.selectPage(page, null);
    System.out.println( "userIPage = " + userIPage);
    System.out.println( "数据总条数:" + userIPage.getSize());
    System.out.println( "数据总页数:" + userIPage.getPages());
    System.out.println( "当前页数:" + userIPage.getCurrent());
    // 获取数据
List<User> records = userIPage.getRecords();
    for (User user :records) {
        System.out.println(user);
    }
}