mybatis入门篇(七):存储过程的操作

1、无ResultType/ResultMap查询

先定义一个查询的存储过程:

DELIMITER //
CREATE PROCEDURE `select_user_by_id`( IN userId BIGINT, OUT userName VARCHAR(50), OUT headImg BLOB, OUT createTime DATETIME )
BEGIN
SELECT user_name, head_img, create_time
INTO userName, headImg, createTime
FROM user
WHERE id=userId;
END
//
DELIMITER ;

编写mapper接口和xml:

public interface UserMapper {
    void selectUsersById(User user);
}

注:存储过程不支持缓存,为了避免缓存配置出错,此处加上useCache=“false”。另外,OUT的参数需要悉数加上jdbcType,因为IN模式下,mybatis指定了jdbcType;同时,对于BLOB格式的参数,需要加上javaType,在mybatis映射的java类中,不建议使用基本类型。blob通常用byte[]表示,故写成_byte[]。(_byte对应byte类型;byte对应Byte类型。)

<select id="selectUsersById" statementType="CALLABLE" useCache="false">
    {call select_user_by_id(
        #{id, mode=IN},
        #{userName, mode=OUT, jdbcType=VARCHAR},
        #{headImg, mode=OUT, jdbcType=BLOB, javaType=_byte[]},
        #{createTime, mode=OUT, jdbcType=TIMESTAMP}
    )}
</select>

调用测试:

@Test
public void UserMapperTest(){
    SqlSession sqlSession = getSqlSession();
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    User user = new User();
    user.setId(2L);
    System.out.println(user.getUserName());
    System.out.println(user.getHeadImg());
    System.out.println(user.getCreateTime());
    userMapper.selectUsersById(user);
    System.out.println("----------------------------------");
    System.out.println(user.getUserName());
    System.out.println(user.getHeadImg());
    System.out.println(user.getCreateTime());
}

调试结果:

2、含ResultType/ResultMap查询

DELIMITER $$
CREATE PROCEDURE `select _user_page`(IN _offset BIGINT, IN _limit BIGINT, OUT total BIGINT)
BEGIN
    #查询数据总数
    SELECT COUNT(*)  INTO total FROM user;
        #分页查询数据
        SELECT * FROM user LIMIT _offset, _limit;
END
$$
DELIMITER $$

编写mapper接口和xml

public interface UserMapper {
    List<User> selectUsersPage(Map<String,Integer> map);
}
<select id="selectUsersPage" statementType="CALLABLE" useCache="false"
          resultType="com.forest.owl.entity.User">
    {call select_user_page(
        #{offset, mode=IN},
        #{limit, mode=IN},
        #{totalCount, mode=OUT, jdbcType=BIGINT, javaType=Integer}
    )}
</select>
@Test
public void UserMapperTest(){
    SqlSession sqlSession = getSqlSession();
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    Map<String, Integer> map = new HashMap<String, Integer>();
    map.put("offset", 0);
    map.put("limit",2);
    List<User> userList = userMapper.selectUsersPage(map);
    System.out.println(userList.size());
    System.out.println(map.get("totalCount"));
}

运行结果:

转载于:https://my.oschina.net/u/4108765/blog/3059551

猜你喜欢

转载自blog.csdn.net/weixin_34337265/article/details/92427499