博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mybatis之基于XML的调用存储过程与手动回滚事务
阅读量:7074 次
发布时间:2019-06-28

本文共 2944 字,大约阅读时间需要 9 分钟。

一、调用存储过程

一、返回单个值

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中设置参数的方向。

    
View Code

3、测试

这里传入参数age=27,然后获取返回的结果值。

String statement="Cuiyw.MyBatis.DBMapping.UserMapper.getUserCount";        Map
map=new HashMap
(); 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

    
View Code

3.测试

String statement="Cuiyw.MyBatis.DBMapping.UserMapper.getUserCount";        Map
map=new HashMap
(); map.put("age", 27); List
users= session.selectList(statement, map); for(int i=0;i
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时,会增加了第一条。

转载地址:http://oukml.baihongyu.com/

你可能感兴趣的文章
R中数据结构
查看>>
mysql数据库学习(二)--表操作
查看>>
学习Qt的一些心得笔记
查看>>
cookie与session组件
查看>>
Windows Server 2008 R2下将JBoss安装成windows系统服务
查看>>
关于dubbo服务的xml配置文件报错的问题
查看>>
Escape
查看>>
运营商 WLAN
查看>>
并发编程 —— ScheduledThreadPoolExecutor
查看>>
zabbix 监控域名证书到期时间!!!!
查看>>
Java Magic. Part 1: java.net.URL
查看>>
异步实现服务器推送消息(聊天功能示例)
查看>>
Python中一个经典的参数错误
查看>>
AutoResetEvent详解
查看>>
Lumen框架—升级改造之路-开篇
查看>>
vs2013 sn key
查看>>
pig安装
查看>>
《R实战》读书笔记一
查看>>
Caused by: java.lang.ClassNotFoundException: javax.persistence.NamedStoredProcedureQuery
查看>>
惊魂时刻!技术生涯中遇到的最让你担惊受怕的事件是什么?
查看>>