我正在从iBatis 2升级到myBatis 3。
该项目包含许多Dao文件。我注意到有些人直接返回数据,其他人则将数据加载到out参数中。
例如,
theData = (List<SomeDataType>) getSqlMapClientTemplace().queryForList("getData", params);
VS
getSqlMapClientTemplate().queryForList("getOtherData", params);
theData = (List<SomeOtherDataType>) params.get("out_cursor");
我认为区别在于mapper中没有返回数据的resultMap:
<parameter property="someData"
javaType="java.sql.ResultSet"
jdbcType="ORACLECURSOR"
mode="OUT" />
但有一个在参数中返回它:
<parameter property="otherData"
javaType="java.sql.ResultSet"
jdbcType="ORACLECURSOR"
mode="OUT"
resultMap="getSomeOtherDataResult" />
问题是,MyBatis3是否允许第一个呼叫类型,或者是否需要从参数中检索所有内容,如第二个呼叫?
在我转换的Dao类中,我使用的Mapper类如下:
MyMapper mapperForSession = getSqlSession().getMapper(MyMapperClass.class);
mapperForSession.getOtherData(params);
return (List<SomeOtherDataType>) params.get("out_cursor");
答案 0 :(得分:1)
你没有提到它,但我理解底层SQL实际上是存储过程或存储函数。
第一个声明适用于一个功能&#34;选择&#34;:
SELECT * FROM theFunction(#{param1}, #{param2})
并且始终存在结果映射,因为Mybatis会将默认情况下的结果集映射到键值映射,因此提供自定义映射并不是必需的。这意味着映射到自定义类型将需要指定可能是极简主义的自定义结果映射:如果列名称匹配属性,则只是目标类型,必要时设置mapUnderscoreToCamelCase
。
第二种方式用于程序样式调用:
{ #{outList, jdbcType=CURSOR, mode=OUT, javaType=java.sql.ResultSet, resultMap=someResultMapId} = call theFunction(#{param1}, #{param2}) }
和实际程序:
{ call theProcedure(#{inParam1}, #{inParam2}, #{outList, jdbcType=CURSOR, mode=OUT, javaType=java.sql.ResultSet, resultMap=someResultMapId}) }