方法
查询
修改
● updateById():默认只修改实体对象entity中不为null的字段。如果类的成员变量添加了@TableField,@TableLogic,则不一定
● update():
- update(entity,null):全量修改,SQL语句中没有where条件,会将entity中的不为空的字段全局修改
Class User{
int id;
String name;
int age;
}
private UserMapper userMapper;
public void test(){
User user=new User();
user.setName("张三");
userMapper.update(user,null);//SQL:update user set name='张三'。没有where条件,也不会修改age字段
}
- update(null,updateWrapper)
Class User{
String name;
int age;
}
private UserMapper userMapper;
public void test(){
UpdateWrapper<User>updateWrapper=new UpdateWrapper();
updateWrapper.set("name","张三");//set方法对应update中的set name="张三"
updateWrapper.eq("id",1);//eq方法设置where条件中id=1
userMapper.update(null,updateWrapper);//SQL:update user set name='张三' where id=1
}
- update(entity,updateWrapper)
Class User{
int id;
String name;
int age;
}
private UserMapper userMapper;
public void test(){
User user=new User();
user.setName("张三");//对应update语句中的set name="张三"。实体对象中的主键字段不会出现在set中,也不会出现在where条件中
UpdateWrapper<User>updateWrapper=new UpdateWrapper();
updateWrapper.set("age",11);//对应update语句中的set age=11
updateWrapper.eq("id",1);//对应udpate语句中的where id=1
//SQL:update user set name='张三',age=11 where id=1
userMapper.update(user,updateWrapper);
删除
● deleteById():
deleteById(1):
对应delete from 表名 where 主键=1
● deleteBatchIds()
List<Integer> ids=new ArrayList<>();
ids.add(2);
ids.add(3);
userMapper.deleteBatchIds(ids);
//SQL:DELETE FROM user wher id in (2,3);
● delete(QueryWrapper queryWrapper)
QueryWrapper<AgentInfo> agentInfoWrapper=new QueryWrapper<>();
agentInfoWrapper.eq("agent_id",4);
agentInfoMapper.delete(agentInfoWrapper);
//SQL:DELETE from user where agent_id=4;
添加
Class User{
int id;
String name;
int age;
}
private UserMapper userMapper;
public void test(){
User user=new User();
user.setName(’zhangsan");
user.setAge(11);
userMapper.insert(user);//SQL:INSERT INTO user(name,age) values("zhangsan",11);
}
重点:
执 行inset之前,user对象的id属性没有值。执行完insert方法后,Mybatisplus会将添加后该记录的主键id赋值给user对象。即执行完inset后,便可以通过user.getId()获取对象的id
其他
@TableLogic注解
- 源码
/**
* 表字段逻辑处理注解(逻辑删除)
*
* @author hubin
* @since 2017-09-09
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})
public @interface TableLogic {
/**
* 默认逻辑未删除值(该值可无、会自动获取全局配置)
*/
String value() default "";
/**
1. 默认逻辑删除值(该值可无、会自动获取全局配置)
*/
String delval() default "";
}
- 理解
通常表中的数据不会完全在数据库中物理删除,而是逻辑删除。此时需要有一个字段(如deleted)表示该记录已删除了。该注解即使用在deleted字段上。如下
public class User{
int id;
String name;
int age;
@TableLogic(val="0",delval="1")
String deleted;
}
- 该字段带来的影响
- 查询:使用查询方法时,会将deleted自动拼接到where条件中
private UserMapper userMapper;
public void test(){
QueryWrapper<User>queryWrapper=new QueryWrapper();
queryWrapper.eq("name","zhangsan");
userMapper.selectList(queryWrapper);
//SQL:SELECT 字段列表 from user WHERE deleted='0' AND( name="zhangsan");
//虽然queryWrapper中没有写eq("deleted","0"),但是依然有
- 修改:
- 会将deleted自动拼接到where条件中。
- 不能通过update方法修改deleted字段。
private UserMapper userMapper;
public void test(){
UpdateWrapper<User>updateWrapper=new UpdateWrapper();
updateWrapper.set("name","张三");//set方法对应update中的set name="张三"
updateWrapper.eq("id",1);//eq方法设置where条件中id=1
userMapper.update(null,updateWrapper);
//SQL:update user set name='张三' where deleted='0' AND ( id=1);
}
- 删除:
- 执行各种delete方法时,实际执行的是update子句,将deleted字段设置为1(delval=“1”)
userMapper.deleteById(1);
//SQL:UPDATE user SET deleted='1' WHERE deleted='0' AND (id = 1)
- 添加
- 添加时没有其他效果,不会自动将deleted字段设置为0,需要写代码或者数据库设置默认值
@TableField之updateStrategy
● 源码解释:
● 个人解释:
public class User{
int id;
@TableField(updateStrategy = FieldStrategy.IGNORED)
private String name;
int age;
@TableLogic(val="0",delval="1")
String deleted;
}
updateStrategy规定了Mybatisplus在执行Update操作时,如何处理该字段。
- NOT_NULL(默认):
在对象的字段类型是引用类型的前提下,如果不是String的对象,当对象为null时不更新该字段。如果是String对象,当对象为null时不更新,如果对象是"",则更新
public class User{
Integer id;
@TableField(updateStrategy = FieldStrategy.NOT_NULL)
private String name;
@TableField(updateStrategy = FieldStrategy.NOT_NULL)
Integer age;
@TableLogic(val="0",delval="1")
String deleted;
}
private UserMapper userMapper;
public void test(){
User user = new User();
user.setId(1);
user.setName("张三");
userMapper.updateById(user);
//SQL:UPDATE user set name="张三" where deleted="0" AND id=1;
//user对象中age=null,所以不会更新age字段
}
public void test1(){
User user = new User();
user.setId(1);
user.setAge(11);
user.setName(null);
userMapper.updateById(user);
//SQL:UPDATE user set age=11 where deleted="0" AND id=1;
//user对象中name=null,所以不会更新name字段
}
public void test2(){
User user = new User();
user.setId(1);
user.setAge(11);
user.setName("");
userMapper.updateById(user);
//SQL:UPDATE user set age=11,name="" where deleted="0" AND id=1;
//user对象中name!=null,而是name="",所以会更新name字段
}
-
NOT_EMPTY:
NOT_EMPTY:如果该实体对象的成员变量是引用类型,字段的值是null或者是空串"",那么执行upate操作时会忽略该字段
○ 也就是,当情况是test2()时,不会更新name字段。 -
IGNORED
IGNORED:该字段始终会出现拼接在update语句中的set语句中。
public class User{
Integer id;
@TableField(updateStrategy = FieldStrategy.IGNORED)
private String name;
@TableField(updateStrategy = FieldStrategy.IGNORED)
Integer age;
@TableLogic(val="0",delval="1")
String deleted;
}
private UserMapper userMapper;
public void test(){
User user = new User();
user.setId(1);
user.setName("");
user.setAge(null);
userMapper.updateById(user);
//SQL:UPDATE user set name="" ,age=null where deleted="0" AND id=1;
//user对象中虽然age=null,name="",但是update语句中依然有set name="",age=null,依然更新age和name字段
}