MyBatis获取基础类型数组、⼆维数组、⾮结构化数据、
ListofStringarray
在MyBatis中,我们通常是使⽤其核⼼功能--映射器(resultMap + handler),将数据库模型与Java Bean进⾏映射,⽅便对数据库进⾏增删改查。
近期的⼯作中遇到⼀个需求是查询⾮结构化的数据,即运⾏时并不知道查询的数据结构。在国内外的⽹站上都进⾏了的搜索,并没有到令⼈满意的解决。
问题可以理解为:需要⼀种MyBatis的配置,能执⾏任意SQL,因为结构未知,因此返回的的数据结构为List<Object[]> 或者
List<String[]>。列表中的⼀项对应查询结果的⼀⾏。
考虑到MyBatis可以通过指定resultType为Java中的包装类型来实现⼀些⾃定义的数据结构,故尝试在resultType中使⽤LinkedHashMap(保证⾏内数据的顺序)。
下⾯是⽰例代码:
mysql语句的执行顺序
<select id="runSQL" parameterType="SqlEntity" resultType="java.util.LinkedHashMap">
${sql}
html输出文本框
</select>
xxxDao.java
List<Map<String, Object>> runSQL(SqlEntity sqlEntity);
在业务层稍作处理,将List<Map<String, Object>>转化为List<Object[]>之后,就可以直接使⽤,或者你也可以转化为你需要的结构了。
private List<Object[]> convert(List<Map<String, Object>> list) {
List<Object[]> ans = new ArrayList<>();
for (Map<String, Object> map: list) {
ans.add(new ArrayList<>(map.values()).toArray());transport的用法归纳
}
give evaluation
return ans;
}
上⾯的xml配置⾥有⽤到⼀个SqlRunner,原因是需要动态配置执⾏的SQL语句,这⾥使⽤了MyBatis的parameterType + ${...}这个字符串替换的⽅法。
${xxx}与#{xxx}有⼀点区别,
空压机容器类别#{xxx}会将参数替换为`?`,然后调⽤jdbc的PreparedStatement.setXXX()⽅法替换变量
${xxx}直接替换字符串,有sql注⼊的风险,此处就不多说了。。
SQL包装类SqlRunner.java
@Data
tour和trip区别
public class SqlRunner {
private String sql;
}
写在最后:MyBatis中,resultType和resultMap不能同时使⽤!!看到这⾥的同学,希望能解决你们的问题,共勉。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。