上一文章mybatis执行存储过程用的是map方式传参执行存储过程,返回游标值的时候,要进行强制类型转换,感觉不是很方便,下面介绍用传bean的方式来执行存储过程,从bean中得到游标的返回值.
bean类:
public class UserList
{
private String iName; // 对应入参,名称一定要与调用的存储过程一样
private List<User> users;// 对应出参(游标),名称一定要与调用的存储过程一样
public String getIName()
{
return iName;
}
public void setIName(String name)
{
iName = name;
}
public List<User> getUsers()
{
return users;
}
public void setUsers(List<User> users)
{
this.users = users;
}
}
存储过程:
CREATE OR REPLACE Procedure getUSERINFOs(iName in varchar,cur_arg out Sys_Refcursor)
is
begin
open cur_arg for Select * From USERINFO t where t.NAME like '%'||iName||'%';
End;
userMapper.xml:
<resultMap type="user" id="<span style="color:#FF0000;">getUserLists</span>"> //定义映射,将游标返回的值封装成user放到users列表中
<id column="id" property="id" />
<result column="name" property="name" />
</resultMap>
<select id="getUserByProc" statementType="CALLABLE" parameterType="com.chenjun.UserList" >
{call getUSERINFOs(#{iName,jdbcType=VARCHAR,mode=IN},#{users,jdbcType=CURSOR,javaType=ResultSet,mode=OUT,resultMap=<span style="color:#FF0000;">getUserLists</span>})}
</select>
dao接口:
public void getUserByProc(UserList bean);
测试方法:
String userConfig = "com/chenjun/mybatis-config.xml";
Reader reader = Resources.getResourceAsReader(userConfig);
// ========== 与hiberate相似,在hibernate中叫sessionFactory及session,而在mybatis中以sql开头,可能因为mybatis中是以sql为操作对象的原因
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
UserList bean = new UserList();
bean.setIName("张");
userDao.getUserByProc(bean);
List<User> users = bean.getUsers();
for (User user : users)
{
System.out.println(user.getName());
}
结果:
张四
张五
张三
这样的操作是不是比传map更好懂,只不过要多写个bean来作参数