本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
@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);
}
}