一、调用存储过程

一、返回单个值

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
DELIMITER ;
SET @user_count = 0;
CALL mybatis.pro_get_usercountbyage(27, @user_count);
SELECT @user_count;

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>

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);

二、返回列表

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 ;

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>

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());
}

二、手动回滚事务

前面的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();
}

上面实现User的新增,增加了两个user,第一个正常的,第二个会报错,当openSession()参数为false时执行上面的代码,会自动回滚,一条数据都没保存,如果是true时,会增加了第一条。

Mybatis之基于XML的调用存储过程与手动回滚事务的更多相关文章

  1. Mybatis之基于XML的增删改查

    这里先吐槽下,写的半天的东西,IE浏览器弹出调试窗口导致写的东西全部没保存,搞得我还要重新用谷歌写,思路全没了,fuck. 前面学习了下spring的DAO层,说起DAO层,那ORM肯定是少不了的,O ...

  2. MyBatis框架基于XML的配置

    什么是MyBatis? 答:它是一个持久层框架 说的太简单了吗?那让我们来看一下官方的文档描述: MyBatis有什么作用呢? 1.持久层的零实现 2.可以自动将数据封装到对象里面不需要手工编写映射的 ...

  3. MyBatis之基于XML的属性与列名映射

    上一博客主要是对单表的增删改查,比较简单,而且每个属性与table表的列都是一一对应名字也一样,今天主要学习属性与table表列名不一致的处理,主要有两种一是属性与列名不一致,二是枚举的情况,这里暂时 ...

  4. MyBatis的学习总结:调用存储过程【参考】

    一.创建存储过程 存储过程的目的:统计edi_test_task 正在运行的任务和非运行的任务 CREATE DEFINER=`root`@`%` PROCEDURE `edihelper`.`SP_ ...

  5. Mybatis之基于XML的表之间映射

    数据库表之间的关系有3种,一对一.一对多.多对多.既然是ORM,这肯定是必须有的.在学习EF的时候也有涉及,今天就是参考着EF的来学习下MyBatis的表关系映射. 一.准备工作 1.准备Model和 ...

  6. MyBatis之基于XML的动态SQL

    先说下我的梦想,大学的时候一直想着是能开店卖胡辣汤,到目前依然还是我的梦想,上周一家出版社联系我问我有没有时间可以合作出书,这也是我的梦想之一,想了想还是放弃了,至少觉得目前不行,毕竟工作还不到五年, ...

  7. 如何在Mybatis的xml文件调用java类的方法

    在mybatis的映射xml文件调用java类的方法:使用的是OGNL表达式,表达式格式为:${@prefix@methodName(传递参数名称)} 1.如下代码所示:方法必须为静态方法:以下我只是 ...

  8. mybatis学习一:基于xml与注解配置入门实例与问题

    注:本case参考自:http://www.cnblogs.com/ysocean/p/7277545.html 一:Mybatis的介绍: MyBatis 本是apache的一个开源项目iBatis ...

  9. MyBatis学习总结(六)——调用存储过程(转载)

    本文转载自:http://www.cnblogs.com/jpf-java/p/6013518.html 一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存 ...

随机推荐

  1. 登录服务器失败 IP 统计和处理方法

    一.登录ssh失败次数统计 1)错误的打开方式 awk '/Failed password/ {print $(NF-3)}' secure |sort -n |uniq -c|sort -n |ta ...

  2. 2.3.7synchronized代码块有volatile同步的功能

    关键字synchronized可以使多个线程访问同一个资源具有同步性,而且他还具有将线程工作内存中的私有变量与公共内存中的变量同步的功能. package com.cky.thread; /** * ...

  3. linux 环境安装

    lnmp.lamp.lnmpa一键安装包(Updated: 2019-02-17) 422 A+ 所属分类:工具 这个脚本是使用shell编写,为了快速在生产环境上部署lnmp/lamp/lnmpa( ...

  4. 本地连接虚拟机 Oracle数据库 报ORA-12541:TNS:no listener

    一.环境 本机环境:win10,pl/sql Developer 虚拟机环境:win10,oracle 11g 1.本机和虚拟机互相ping都可以ping通. 2.虚拟机监听程序已启动. 二.配置文件 ...

  5. Linux pwn入门教程(2)——shellcode的使用,原理与变形

    作者:Tangerine@SAINTSEC 0×00 shellcode的使用 在上一篇文章中我们学习了怎么使用栈溢出劫持程序的执行流程.为了减少难度,演示和作业题程序里都带有很明显的后门.然而在现实 ...

  6. Servlet案例2:文件下载

    首先,解决两个小问题 1.输入中文乱码问题 一个小Demo即可解决: package demo; import java.io.IOException; import java.io.PrintWri ...

  7. iOS开发总结——项目目录结构

    1.前言 清晰的项目目录结构有利于项目的开发,同时也是软件架构的一部分,所以,项目开发之初搭建项目的目录结构很重要.刚转iOS时,自己并不知道如何搭建App的项目目录,在参与开发两个应用后,结合Web ...

  8. C# 对密码等数据进行对称性加密解密

    类: /// <summary> /// DESEncrypt加密解密算法. /// </summary> public class DESEncrypt { private ...

  9. 线程的中断(Lock与synchronized)

    Thread包含interrupt()方法,因此你可以终止被阻塞的任务,这个方法将设置线程的中断状态.如果一个线程已经被阻塞,或者试图执行一个阻塞操作.那么设置这个线程的中断状态将 抛出Interru ...

  10. 交换路由中期测验20181226(动态路由配置与重分发、NAT转换、ACL访问控制列表)

    测试拓扑: 接口配置信息 HostName 接口 IP地址 网关 Server 0 Fa0 172.16.15.1/24 172.16.15.254 Server 1 Fa0 100.2.15.200 ...