Mybatis之基於XML的調用存儲過程與手動回滾事務


一、調用存儲過程

一、返回單個值

1、存儲過程准備

這里先創建一個存儲過程,傳入參數為age,傳出參數為count。然后先測試一下是否正確。

CREATE DEFINER=`root`@`localhost` PROCEDURE `pro_get_usercountbyage`(in age int,out user_count int)
BEGIN
 select count(1) into user_count from user a where a.age=age;
END
View Code
DELIMITER ;
SET @user_count = 0;
CALL mybatis.pro_get_usercountbyage(27, @user_count);
SELECT @user_count;
View Code

2、XML配置

這里配置傳入參數的映射parameterMap,statementType,在parameterMap中設置參數的方向。

    <select id="getUserCount" parameterMap="getUserCountMap" statementType="CALLABLE">
        CALL pro_get_usercountbyage(?,?)
    </select>
    <parameterMap type="java.util.Map" id="getUserCountMap">
        <parameter property="age" mode="IN" jdbcType="INTEGER"/>
        <parameter property="usercount" mode="OUT" jdbcType="INTEGER"/>
    </parameterMap>
View Code

3、測試

這里傳入參數age=27,然后獲取返回的結果值。

        String statement="Cuiyw.MyBatis.DBMapping.UserMapper.getUserCount";
        Map<String,Integer > map=new HashMap<String,Integer>();  
        map.put("age", 27);  
        session.selectOne(statement, map);
        int result = map.get("usercount");
        System.out.println(result);
View Code

 二、返回列表

1.返回列表的和返回多個值的基本沒太大區別,只是有一個地方需要注意,就是在存儲過程select的列名要和resultMap的一致,我就踩到坑了在這個地方。存儲過程還是在上面存儲過程上改的。返回table。

DELIMITER ;

CALL mybatis.pro_get_usercountbyage(27);
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `pro_get_usercountbyage`(in age int)
BEGIN
 select *  from user a where a.age=age;
END$$
DELIMITER ;
View Code

2.xml配置

這個只是增加了resultMap

    <select id="getUserCount" parameterMap="getUserCountMap" statementType="CALLABLE" resultMap="userResult">
        CALL pro_get_usercountbyage(?)
    </select>
    <parameterMap type="java.util.Map" id="getUserCountMap">
        <parameter property="age" mode="IN" jdbcType="INTEGER"/>
    </parameterMap>
View Code

3.測試

        String statement="Cuiyw.MyBatis.DBMapping.UserMapper.getUserCount";
        Map<String,Integer > map=new HashMap<String,Integer>();  
        map.put("age", 27);  
        List<User>users= session.selectList(statement, map);
        for(int i=0;i<users.size();i++)
        {
            System.out.println(users.get(i).toString());
        }
View Code

二、手動回滾事務

前面的demo中都是openSession()傳的都是true,表示自動開啟事務,這里演示下不是自動的情況。

        String resource = "Config.xml";
        //使用MyBatis提供的Resources類加載mybatis的配置文件(它也加載關聯的映射文件)
        Reader reader = Resources.getResourceAsReader(resource); 
        //構建sqlSession的工廠
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //創建能執行映射文件中sql的sqlSession
        SqlSession session = sessionFactory.openSession(false);
//        System.out.println("新增");
        String statement="Cuiyw.MyBatis.DBMapping.UserMapper.addUser";
        try{
            User user1=new User();
            user1.setName("Cuiyw");
            user1.setAge(27);
            user1.setStatus(UserState.AVAILABLE);
            int result=session.insert(statement, user1);
            User user2=new User();
            user2.setName("Cuiyw");
            user2.setAge(1/0);
            user2.setStatus(UserState.AVAILABLE);
            result=session.insert(statement, user2);
            session.commit();
            System.out.println("OK");
        }
        catch(Exception e){
               System.out.println("出錯------------");
               e.printStackTrace();
               session.rollback();
        }
        finally
        {
            session.close();
        }
View Code

上面實現User的新增,增加了兩個user,第一個正常的,第二個會報錯,當openSession()參數為false時執行上面的代碼,會自動回滾,一條數據都沒保存,如果是true時,會增加了第一條。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM