上篇最后我们重点讲解了MP中的查询操作,这篇我们来讲解一下MP中的增删改操作及其注意事项
在新增业务中,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;
}
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);
}
数据库存储结果:
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);
}
如果项目中使用的ID生成策略是一种,那就需要到每个实体类中都加一遍@TableId
主键,比较繁琐,可以直接在application.yml文件中进行全局配置:
mybatis-plus:
global-config:
db-config:
id-type: assign_id
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执行语句
实际业务中的删除业务为两大类,为物理删除和逻辑删除
实现步骤:
在数据库表中设置表示状态的字段(名称任意,内容也可自定义)
我这里使用int类型的deleted字段来表示,0表示正常,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;
}
进行测试
@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