MyBatis如何调用mysql数据库存储过程

MyBatis如何调用mysql数据库存储过程

存储过程的含义:是一组预先写好的能实现某种功能的T-SQL程序,是存储在服务器上的预编译集合。

(存储过程是一种独立的数据库对象,在服务器上创建和运行。)
存储过程的优点:模块化编程、执行速度快效率高、减少网络流量、提供一种安全机制。(存储过程在执行1次后,其执行计划就保存在内存中,以后在执行时就不必再进行编译和优化。)

在mysql服务带宽不够,或者说与服务连接不稳定时,再者还有可能sql命令过长。在这种情况下导致的服务响应慢,可以通过使用数据库的存储过程来进行优化。
mybatis是目前市场上最流行的持久层框架,本身就支持对数据库存储过程的调用。

1.根据需要创建自己所需的存储过程

使用我本地的临时的测试表来作为演示对象
test
在这里插入图片描述

  • 创建查询用存储过程
#查询用存储过程
DELIMITER //
CREATE PROCEDURE pSelect (IN p_id INT,IN p_version INT) BEGIN
SELECT
 *
FROM
 test
WHERE id=p_id
AND version = p_version;
END //
DELIMITER;
  • 创建插入用存储过程
#插入用存储过程
DELIMITER //
CREATE PROCEDURE pInsert (IN p_text VARCHAR(20),IN p_version INT) BEGIN
INSERT INTO test
(text,version)
VALUES
(p_text,p_version);
END //
DELIMITER;
  • 创建更新用存储过程
#更新用存储过程
DELIMITER //
CREATE PROCEDURE pUpdate (IN p_id INT,IN p_text VARCHAR(20),IN p_version INT) BEGIN
UPDATE test SET text=p_text,version=p_version
WHERE id = p_id;
END //
DELIMITER;
  • 创建删除用存储过程
#删除用存储过程
DELIMITER //
CREATE PROCEDURE pDelete (IN p_id INT) BEGIN
DELETE FROM test WHERE id=p_id;
END //
DELIMITER;

创建存储过程的语法类似一般的方法声明,声明传入参数,在BEGIN~END 之间也还是遵循一般CRUD的sql语法。

2.定义DAO

/**
 * @author machenike
 */
public interface TestDao  {
    List<TestEntity> queryAll();

    List<TestEntity> select(TestEntity testEntity);

    int update(TestEntity testEntity);

    int delete(Integer id);

    int insert(TestEntity testEntity);
}

3.Mapper.xml定义

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="club.dlblog.dao.TestDao">

    <select id="queryAll" resultType="club.dlblog.entity.TestEntity">
        SELECT * FROM test
    </select>
    <!--查询-调用存储过程-->
    <select id="select" resultType="club.dlblog.entity.TestEntity"
            parameterType="club.dlblog.entity.TestEntity"
            statementType="CALLABLE">
		{CALL pSelect(#{id,mode=IN},#{version,mode=IN})}
    </select>
   <!--插入-调用存储过程-->
    <insert id="insert" parameterType="club.dlblog.entity.TestEntity"
            statementType="CALLABLE">
        {CALL pInsert(#{text,mode=IN},#{version,mode=IN})}
    </insert>
   <!--更新-调用存储过程-->
    <update id="upadate" parameterType="club.dlblog.entity.TestEntity"
            statementType="CALLABLE">
          {CALL pUpdate(#{id,mode=IN},#{text,mode=IN},#{version,mode=IN})}
    </update>
   <!--删除-调用存储过程-->
    <delete id="delete" parameterType="java.lang.Integer"
            statementType="CALLABLE">
         {CALL pDelete(#{id,mode=IN})}
    </delete>
</mapper>

需要注意与传统的mapper的定义其实差别不大,statementType="CALLABLE"
记得声明命令类型,***#{id,mode=IN}*** 作为入参的参数记得注意书写格式。


接下来直接调用testDao就可以,其实存储过程可以定义的很复杂,我这里为了演示,就未作过多的说明。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值