目录
1. 创建存储过程
存储过程名为pr_BlurNameCount(),IN和OUT:
输入参数为myName,查询username=‘lyx'的用户数量,输出参数为u_count
类型为varchar和int
2. UserMapper.xml文件中写sql标签
如图,在select标签中定义
通过调用【存储过程】:call 存储过程名 实现查询,
statementType="CALLABLE"设置SQL的执行方式是存储过程
存储过程的输入参数,在mybatis用Map来场传递(HashMap)
parameterType="HashMap"
所以parameterType="HashMap"是固定写法
输入参数myName和输出参数u_count需要通过HashMap的key值来指定
call 存储过程名(输入参数,输出参数)
要指定两者的jdbcType和mode,其中输入参数的jdbcType为varchar类型,mode为IN
输入参数的jdbcType为INTEGER类型,mode为OUT
<!-- 通过调用【存储过程】实现查询,
statementType="CALLABLE"设置SQL的执行方式是存储过程
存储过程的输入参数,在mybatis用Map来场传递(HashMap)
存储过程的输入参数myName和输出参数u_count需要通过HashMap来指定
-->
<select id="queryCountByBlurName" statementType="CALLABLE" parameterType="HashMap">
{ call pr_BlurNameCount(#{myName,jdbcType=VARCHAR,mode=IN},#{u_count,jdbcType=INTEGER,mode=OUT})}
</select>
3. UserDao接口
没有返回值,存储过程的结果在HashMap中key值为u_count
4. 测试
这里演示的是查询,测试代码不需要sqlSession.commitI();
如果是删除和修改的存储过程,需要提交,不然会报错;
究其原因,还是mybatis配置文件中的事务管理是jdbc
import com.lyx.mybatis.dao.UserDao;
import com.lyx.mybatis.entity.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;
public class Test {
public static void main(String[] args) throws IOException {
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
//这个session相当于connection
SqlSession sqlSession = sqlSessionFactory.openSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
HashMap<String,Object> hashMap = new HashMap<>();
hashMap.put("myName","lyx");
mapper.queryCountByBlurName(hashMap);
System.out.println(hashMap.get("u_count"));
sqlSession.commit();
}
}
5. 报错
JavaType和JdbcType的对应关系
MyBatis配置Mapping,JavaType和JDBCType的对应关系,#与$区别 https://www.cnblogs.com/zengming/p/7769219.html