zoukankan      html  css  js  c++  java
  • 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时,会增加了第一条。

  • 相关阅读:
    视频直播点播平台EasyDSS浏览器控制台报”命名重复“错误解决办法
    视频直播点播平台EasyDSS登录页如何实现插入产品广告位?
    视频直播点播平台EasyDSS系统如何将数据库迁移到Mysql数据库?
    视频直播点播系统EasyDSS如何将已存储的视频文件进行迁移?
    人工智能正在推动“硅”复兴
    人工智能如何重新定义云计算技术并提高业务效率
    《Nature》子刊:不仅是语言,机器翻译还能把脑波「翻译」成文字
    一文读懂机器阅读理解
    大数据算法应用的测试发展之路
    从800个GPU训练几十天到单个GPU几小时,看神经架构搜索如何进化
  • 原文地址:https://www.cnblogs.com/5ishare/p/8379217.html
Copyright © 2011-2022 走看看