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
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就可以,其实存储过程可以定义的很复杂,我这里为了演示,就未作过多的说明。