Mybatis-Plus知识点总结(下)

Mybatis-Plus知识点总结(下)

上篇最后我们重点讲解了MP中的查询操作,这篇我们来讲解一下MP中的增删改操作及其注意事项

1.增加(insert)

1.1 id生成策略

在新增业务中,id的生成方式是一个大家一个比较关注的问题,不同的业务应该有不同的id生成方式,在MP中有以下几种id生成策略,基于@TableId 实现

名称 @TableId
类型 属性注解
位置 模型类中用于表示主键的属性定义上方
作用 设置当前类中主键属性的生成策略
相关属性 value(默认):设置数据库表主键名称
type:设置主键属性的生成策略,值查照IdType的枚举值

Mybatis-Plus知识点总结(下)_第1张图片

  • AUTO:使用数据库ID自增,使用的时候需要确保数据库中的对应的表的主键设为自增

    1.在对应的实体类加上注解,设置id生成策略

    
    @TableName("user")
    public class User {
    
        @TableId(type = IdType.AUTO)
        private int id;
        private String username;
        private Integer age;
        private String sex;
    }
    
    

    2.将数据库中对应的表id设为自动增长,可以修改自增的值(以可视化工具sqlyog为例)

    在这里插入图片描述

    可以修改自增数据开始的值

Mybatis-Plus知识点总结(下)_第2张图片

3.进行测试

	@Test
   void testSave(){
      //1.定义一个新的User对象,并对属性赋值
	   User user = new User();
	   user.setUsername("zhangsan");
	   user.setAge(21);
	   user.setSex("男");
	   //2.调用userMapper中的方法向数据库中进行插入
	   userMapper.insert(user);
   }

​ 数据库存储结果:

Mybatis-Plus知识点总结(下)_第3张图片

  • NONE: 不设置ID生成策略

    1.在对应的实体类加上注解,设置id生成策略

    @TableName("user")
    public class User {
        @TableId(type = IdType.NONE)
        private int id;
        private String username;
        private Integer age;
        private String sex;
    }
    

    2.进行测试,可以手动设置ID,也可让其自己生成

    @Test
       void testSave(){
          //1.定义一个新的User对象,并对属性赋值
    	   User user = new User();
    	   user.setId(12);
    	   user.setUsername("zhangsan");
    	   user.setAge(21);
    	   user.setSex("男");
    	   //2.调用userMapper中的方法向数据库中进行插入
    	   userMapper.insert(user);
       }
    
  • INPUT: 用户手工输入ID

    1.在对应的实体类加上注解,设置id生成策略

    @TableName("user")
    public class User {
        @TableId(type = IdType.INPUT)
        private int id;
        private String username;
        private Integer age;
        private String sex;
    }
    

    2.进行测试,需要手动设置ID

    	@Test
       void testSave(){
          //1.定义一个新的User对象,并对属性赋值
    	   User user = new User();
    	   user.setId(23);
    	   user.setUsername("zhangsan");
    	   user.setAge(21);
    	   user.setSex("男");
    	   //2.调用userMapper中的方法向数据库中进行插入
    	   userMapper.insert(user);
       }
    

    注意:使用此种策略之前需要删除对应数据库表中的自增策略

  • ASSIGN_ID:使用雪花算法生成ID(兼容数值类型和字符串类型)

    1.在对应的实体类加上注解,设置id生成策略

    @TableName("user")
    public class User {
        @TableId(type = IdType.ASSIGN_ID)
        private long id;
        private String username;
        private Integer age;
        private String sex;
    }
    

    2.测试

    	@Test
       void testSave(){
          //1.定义一个新的User对象,并对属性赋值
    	   User user = new User();
    	   user.setUsername("zhangsan");
    	   user.setAge(21);
    	   user.setSex("男");
    	   //2.调用userMapper中的方法向数据库中进行插入
    	   userMapper.insert(user);
       }
    

    注意:使用此种策略可以不手动设置ID,如果手动设置ID,则会使用自己设置的值

  • ASSIGN_UUID:使用UUID算法生成ID

    1.在对应的实体类加上注解,设置id生成策略,使用UUID主键应定义为String类型

    @TableName("user")
    public class User {
        @TableId(type = IdType.ASSIGN_UUID)
        private String id;
        private String username;
        private Integer age;
        private String sex;
    }
    

    2.修改对应的数据库表的主键长度为32位,因为UUID生成的主键为32位,如果长度小的话就会导致增加失败
    在这里插入图片描述

    3.测试,不需要手动设置ID

	@Test
   void testSave(){
      //1.定义一个新的User对象,并对属性赋值
	   User user = new User();
	   user.setUsername("zhangsan");
	   user.setAge(21);
	   user.setSex("男");
	   //2.调用userMapper中的方法向数据库中进行插入
	   userMapper.insert(user);
   }
1.2 id生成策略对比分析
  • AUTO:数据库ID自增,此种策略适合只有单台服务器的时候进行使用,不可以作为分布式ID使用
  • NONE:不设置ID生成策略,MP也不自动生成,和INPUT类似,两种方式都需要用户手动设置,手动设置的一个问题是ID容易出现冲突,为了保证ID不冲突就需要做很多的判定,实现起来比较复杂
  • INPUT:需要用户手动设置,手动设置的一个问题是ID容易出现冲突,为了保证ID不冲突就需要做很多的判定,实现起来比较复杂
  • ASSIGN_ID:雪花算法,可以适用于分布式的情况,生成的是long类型的数字,但生成策略和服务器的时间有关,如果服务器时间改了,则可能会出现主键重复的问题
  • ASSIGN_UUID:可以适用于分布式的情况,能够保证唯一性,生成的是32位的字符串,但是长度过长,不能进行排序,查询效率比较低
1.3 简化配置

如果项目中使用的ID生成策略是一种,那就需要到每个实体类中都加一遍@TableId主键,比较繁琐,可以直接在application.yml文件中进行全局配置:

mybatis-plus:
  global-config:
    db-config:
    	id-type: assign_id

2.删除(delete)

2.1 批量删除
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
参数解释:
    idList:存放要删除对象id的集合
    int:返回值,删除成功返回1,不成功返回0

测试代码

@Test
	void testDeleteBatch(){
		List<Integer> list = new ArrayList<>();
		list.add(12);
		list.add(13);
		list.add(14);
		userMapper.deleteBatchIds(list);
	}

sql执行语句
在这里插入图片描述

2.2 逻辑删除

实际业务中的删除业务为两大类,为物理删除和逻辑删除

  • 物理删除:数据从数据库中删除,执行的是delete操作
  • 逻辑删除:为数据设置一个状态字段,逻辑删除时更改字段状态为不可用,数据库仍保留数据,实际执行的是update操作

实现步骤:

  1. 在数据库表中设置表示状态的字段(名称任意,内容也可自定义)

    我这里使用int类型的deleted字段来表示,0表示正常,1表示失败

在这里插入图片描述

  1. 在实体类中定义相对应的字段,并在字段上添加@TableLogic 注解

    名称 @TableLogic
    类型 属性注解
    位置 模型类中用于表示删除字段的属性定义上方
    作用 标识该字段为进行逻辑删除的字段
    相关属性 value:逻辑未删除值
    delval:逻辑删除值
    TableName("user")
    public class User {
        @TableId(type = IdType.AUTO)
        private int id;
        private String username;
        private Integer age;
        private String sex;
        @TableLogic(value ="0" ,delval = "1")
         //value为正常数据的值,delval为删除数据的值
        private int deleted;
    
    }
    
    
  2. 进行测试

       @Test
       void testDelete(){
    		//1.根据id进行删除
    	   userMapper.deleteById(8);
       }
    

在这里插入图片描述

​ 根据控制台打印的语句可以看出来,逻辑删除执行的是update操作,把状态进行了改变

注意

  • 数据进行逻辑删除后,对数据的查询也是有影响的,可以通过执行查询操作来观察
@Test
   void testSearch(){
		List<User> users = userMapper.selectList(null);
		System.out.println(users);

	}

通过控制台打印的sql语句可以看出,后面加上了一个用于判断逻辑删除状态的字段,delete=0代表显示未进行逻辑删除的值

  • 如果想要查看所有的数据,包括逻辑删除后的数据,需要自己去编写查询语句

    @Mapper
    public interface UserMapper extends BaseMapper<User> {
        //查询所有数据,包含逻辑删除的数据
        @Select("select * from user")
        List<User> userList();
    }
    
  • 如果每个实体类都需要加逻辑删除的字段,可以进行全局的配置

    mybatis-plus:
      global-config:
        db-config:
          # 逻辑删除字段名
          logic-delete-field: deleted
          # 逻辑删除字面值:未删除为0
          logic-not-delete-value: 0
          # 逻辑删除字面值:删除为1
          logic-delete-value: 1
    
  • 如果每个实体类都需要加逻辑删除的字段,可以进行全局的配置

    mybatis-plus:
      global-config:
        db-config:
          # 逻辑删除字段名
          logic-delete-field: deleted
          # 逻辑删除字面值:未删除为0
          logic-not-delete-value: 0
          # 逻辑删除字面值:删除为1
          logic-delete-value: 1
    

你可能感兴趣的:(Java,mybatis,java,数据库)