1. 程式人生 > >詳解mybatis的create,retrieve,delete,update返回值。

詳解mybatis的create,retrieve,delete,update返回值。

首先是select

        User user = new User();
        user.setName("l2");
        user.setPassword("444");
        int i =  userMapper.addUser(user);
        System.out.println(i);
    <select id="getUserById" parameterType="Integer" resultType="User">
        select * from t_user where id = #{id};
    </select>

select的返回值沒什麼好說的,寫的不是有resultType還有resultMap嘛,那就是返回值了。

        User user = userMapper.getUserById(1);
        System.out.println(user.toString());

測試的資料也比較簡單。這個就沒什麼說的了。

然後是save

    <insert id="addUser" parameterType="User">
        INSERT INTO `db_ssm`.`t_user` (`id`, `name`, `password`)
        VALUES
          (null, #{name}, #{password}) ;
    </insert>

save也比較簡單,測試的貼上來。

        User user = new User();
        user.setName("l2");
        user.setPassword("444");
        int i =  userMapper.addUser(user);
        System.out.println(i);

貌似也比較簡單,也沒什麼說的了。

等等,好像忘記了本文的中心思想了,沒錯,說的就是save。

save 如果成功的話返回值是1,因為我只插入了一條資料。為什麼要提資料的事呢,是因為據說這個save返回的就是插入的資料的條數。如果插入多條資料的話…… 想入非非中。可能就不是1了啊。這個我就不試了,遇到的時候再試。

這是驗證的結果。

那有的人要問了,如果插入出錯了呢。

重新模擬插入錯誤的,

        User user = new User();
//        user.setName("l2222");
        user.setPassword("111");
        int i =  userMapper.addUser(user);
        System.out.println(i);

註釋掉name,

在我的資料庫中name是不可以為空的。

所以硬要插入的話肯定會出錯的。下面演示結果。

華麗的出錯了,瞬間把我原來以為結果會是0的想法衝擊的粉碎。

正是我想要的結果。

所以

save的結果,如果成功返回的是1(可能是這個1是影響的條數),失敗返回的是exception,而不是0。

身為社會有識青年,怎麼能容忍異常的呢。我先簡單的處理一下。

        User user = new User();
        user.setPassword("33333");
        int i = 0;
        try {
            i = userMapper.addUser(user);
        } catch (Exception e) {
            i = -1;
        } finally {
        }
        System.out.println(i);

這樣一搞,如果插入成功的話返回的是1,如果不成功的話返回的是-1。

豈不妙哉,我都佩服自己的聰明才智了。但是我不能排除有沒有可能返回0,所有如果返回的數字不小於1判定為插入成功。

但是一般情況下,我們插入成功了,就要在頁面上馬上用ajax展示出來。但是遺憾的是,我們的這個user怎麼能沒有id呢,沒有id有怎麼查,怎麼刪,怎麼改。所以我們在插入的時候要是可以得到id就更好了。

    <insert id="addUser1" parameterType="User" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO `db_ssm`.`t_user` (`id`, `name`, `password`)
        VALUES
          (null, #{name}, #{password}) ;
    </insert>

看到後面 的兩個資料了嗎?

useGeneratedKeys="true" 這是必須的。
keyProperty="id" 這是id就是繫結的id,那我就疑惑了,這繫結的哪個id啊。令人頭疼。你這個返回值明明是int,難道返回的就是這個id。

這個先看測試的檔案

        User user = new User();
        user.setName("1222");
        user.setPassword("44122224");
        int i = 0;
        try {
            i = userMapper.addUser1(user);
            sqlSession.commit();
        } catch (Exception e) {
            System.out.println("add error");
        } finally {
        }
        System.out.println(user.toString());

        System.out.println(i);

 

看到這到是明白了,原來不是把id當成返回值啊,原來它是把

parameterType="User" 這是user的id設定成了插入的id。

進來的是沒有id的user,出去的是有id的user,真是太厲害了,沒想到不僅把返回值改變了,連引數都發生了改變,真是太神奇了。亮瞎了我眼。這思想的境界之高,我等真是不能望其項背。

返回值還是插入的條數。

哦,弄到這,mybatis插入的返回值我是瞭解的差不多了。

delete

    <delete id="deleteUser" parameterType="Integer" >
        delete from t_user where id = #{id}
    </delete>

我先找個你肯定刪不掉的為難你

        int i = 0;
        try {
            i = userMapper.deleteUser(222222);
            sqlSession.commit();
        } catch (Exception e) {
            System.out.println("delete error");
        } finally {
        }
        System.out.println(i);

我讓你刪id是222222的,我還沒建立呢,看你怎麼刪

 

刪不掉的就返回個0啊,好簡單,為什麼 不說This can't be deleted,一點都不智慧。


        int i = 0;
        try {
            i = userMapper.deleteUser(14);
            sqlSession.commit();
        } catch (Exception e) {
            System.out.println("delete error");
        } finally {
        }
        System.out.println(i);

那試試正常的id= 14

哦,刪除正常的返回是1。

我給你個刪都刪不動的,你怎麼搞。

如果刪有外來鍵約束的會報錯。哈哈哈。

 `FK_test` FOREIGN KEY (`name`) REFERENCES `t_user` (`name`)

update

寫到這已經累了,不想寫了,但是還有一點,趕緊寫完得了。

    <update id="updateUser" parameterType="User">
        update t_user set name = #{name}, password = #{password} where id = #{id}

    </update>

 

測試 成功 

        User user = new User();
        user.setId(9);
        user.setName("121111");
        user.setPassword("11111");
        int i = 0;
        try {
            i = userMapper.updateUser(user);
            sqlSession.commit();
        } catch (Exception e) {
            System.out.println("delete error");
        } finally {
        }
        System.out.println(i);

成功是1,失敗是0

 

錯誤是異常

總結 

成功是1,失敗是0,錯誤是異常。一定要捕捉異常。不然專案就崩了。