• Mybatis-Plus知识点总结(下)


    Mybatis-Plus知识点总结(下)

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

    1.增加(insert)

    1.1 id生成策略

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

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

    在这里插入图片描述

    • 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;
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

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

      在这里插入图片描述

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

    在这里插入图片描述

    3.进行测试

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

    ​ 数据库存储结果:

    在这里插入图片描述

    • 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;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8

      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);
         }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
    • 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;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8

      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);
         }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

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

    • 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;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8

      2.测试

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

      注意:使用此种策略可以不手动设置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;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8

      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
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    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
    
    • 1
    • 2
    • 3
    • 4

    2.删除(delete)

    2.1 批量删除

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

    测试代码

    @Test
    	void testDeleteBatch(){
    		List<Integer> list = new ArrayList<>();
    		list.add(12);
    		list.add(13);
    		list.add(14);
    		userMapper.deleteBatchIds(list);
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    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;
      
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
    2. 进行测试

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

    在这里插入图片描述

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

    注意

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

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

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

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

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

      mybatis-plus:
        global-config:
          db-config:
            # 逻辑删除字段名
            logic-delete-field: deleted
            # 逻辑删除字面值:未删除为0
            logic-not-delete-value: 0
            # 逻辑删除字面值:删除为1
            logic-delete-value: 1
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
  • 相关阅读:
    混合动力电动车优化调度与建模(发动机,电机,电池组等组件建模)(Matlab代码实现)
    createSocketTask:fail wcwss url not in domain list 小程序网络异常
    virtualbox安装的linux虚拟机安装并启动Tomcat过程(结合idea操作)记录,并使用宿主机访问页面
    MySQL:你做过哪些MySQL的优化?
    Pygame中监控鼠标动作的方法
    HOW TO EASILY CREATE BARPLOTS WITH ERROR BARS IN R
    Maven项目构建工具
    猿创征文 |《深入浅出Vue.js》打卡Day6
    Telnet连接
    解决nacos注册地址改为本地IP
  • 原文地址:https://blog.csdn.net/m0_47209867/article/details/126154113