【mybatis】
insert和update到底返回什么?
inset时到底成功返回1,失败呢?返回0还是-1,还是抛异常
什么情况下抛异常,主键冲突下会怎么样,以及delete
还有update到底返回的是受影响的行数还是条件匹配的行数
实践出真知,实验一下
如果对mybatis 比较熟悉的朋友就不用往下看了=-=
mybatis菜鸟的实验篇
目录
insert
就搞一个简单的demo吧!
create table person (
id int NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
name varchar(10) NOT NULL COMMENT '姓名',
age int NOT NULL COMMENT '年龄'
);
单元测试我们也不用断言什么的,为了方便直接打出来
@Test
public void testInsert() {
Person person = new Person();
person.setName("tian");
person.setAge(22);
int rst = personMapper.insert(person);
System.out.println(rst);
}
这个没什么问题,输出1
如果name没有设置,我们再来看下
@Test
public void testInsert() {
Person person = new Person();
//person.setName("tian");
person.setAge(22);
int rst = personMapper.insert(person);
System.out.println(rst);
}
会抛异常,说name列不允许为空
也可以捕捉异常打日志吞掉异常,也可以再throw出去
如果不想吞掉原异常,log后带上e
如果我们想插入成功,返回id呢?
@Insert("insert into person(name,age) value(#{name},#{age})")
@Options(useGeneratedKeys=true, keyProperty="id", keyColumn="id")
int insert(Person person);
@Test
public void testInsert() {
int rst = -1;
Person person = new Person();
person.setName("tian");
person.setAge(22);
try {
rst = personMapper.insert(person);
}catch (Exception e){
log.info("insert fail,person:{}",person.toString(),e);
}
System.out.println("rst:"+rst);
System.out.println("id:"+person.getId());
}
好了,这里我们没有唯一键,我们再考虑一哈唯一键的情况
create unique index uk_name on person(name);
再执行一下刚才的insert
如果是批量插入,返回值是多少呢,是1嘛?还是新增的个数呢?
@Insert({
"<script>",
"insert into person(name,age) ",
"values ",
"<foreach collection='personList' item='item' index='index' separator=','>",
"(#{item.name}, #{item.age})",
"</foreach>",
"</script>"
})
int insertBatch(@Param("personList") List<Person> personList);
@Test
public void testInsertBatch() {
int rst = -1;
Person person = new Person();
person.setName("tian");
person.setAge(22);
Person person1 = new Person();
person1.setName("doinb");
person1.setAge(22);
Person person2 = new Person();
person2.setName("lwx");
person2.setAge(20);
List<Person> personList = new ArrayList<>();
personList.add(person);
personList.add(person1);
personList.add(person2);
try {
rst = personMapper.insertBatch(personList);
}catch (Exception e){
log.info("insert fail,person:{}",personList,e);
}
System.out.println("rst:"+rst);
}
答案是新增的行数 3(受影响的行数)
insert小结:
1,insert 成功返回1,失败不是返回0而是抛异常
2,如果需要insert 返回id @Options(useGeneratedKeys=true, keyProperty="id", keyColumn="id")
3,唯一键冲突一般是为了为幂等消息做兜底,防止插入2条业务意义上相同的数据
delete
@Test
public void testDelete() {
int rst = personMapper.delete(1);
System.out.println(rst);
}
执行一次,删除成功,输出1,这一点没什么问题
再执行一次,删除失败,输出0,因为该行记录已被删除,不会抱什么该行数据不存在之类的异常
delete小结:
1,删除成功,返回1
2,删除失败,返回0
update
@Test
public void testUpdate() {
Person person1 = new Person();
person1.setId(13);
person1.setName("doinb666");
person1.setAge(23);
int rst = personMapper.update(person1);
System.out.println(rst);
}
执行一遍这个单测,update成功,输出1
再执行一遍这个单测呢(就是说set的值不变)?是返回1还是0呢
还是返回1,返回的不应该是0嘛,因为值都没变,何来更新?
更新一次返回受影响的行数没问题是1,第二次更新的值没变等于说没更新为什么还是1
因为更新返回的是match的值,就是根据id条件匹配的值,而不是受影响的行数
这是不是一个巨坑!!!
我们在url最后加上useAffectedRows=true
再跑单元测试返回的就是0了
@Test
public void testUpdate() {
Person person1 = new Person();
person1.setId(99);
person1.setName("doinb666");
person1.setAge(23);
int rst = personMapper.update(person1);
System.out.println(rst);
}
如果更新一个不存在的id呢?
返回的是0
update小结:
1,update返回match的行数
2,useAffectedRows=true
[返回受影响的行数]
没有受影响的就返回0,有受影响的行数就返回受影响的行数
转载请注明:汪明鑫的个人博客 » mybatis的insert和update到底返回什么
说点什么
您将是第一位评论人!