Welcome everyone

mybatis的insert和update到底返回什么

java 汪明鑫 957浏览 0评论

【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到底返回什么

喜欢 (0)

说点什么

您将是第一位评论人!

提醒
avatar
wpDiscuz