dao层,增加SqlMapper.java和 对应的SQLMapper.xml
package rg.contacts.mapper;
import java.util.LinkedHashMap;
import java.util.List;
import rg.contacts.vo.SqlVo;
public interface SQLMapper {
List<LinkedHashMap<String, Object>> selectBysql(SqlVo sqlVo);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="rg.contacts.mapper.SQLMapper">
<!-- ##### 万能SQL原生映射 -zyh ##### -->
<select id="selectBysql" parameterType="rg.contacts.vo.SqlVo" resultType="java.util.LinkedHashMap">
${sql}
</select>
</mapper>
其中,使用 java.util.LinkedHashMap 作为返回类型,可以保持结果集本来的字段顺序。
为了避免出现 :there no getter sql in java.lang.String 的异常,需要将sql分装到SqlVo.java
package rg.contacts.vo;
public class SqlVo {
private String sql;
public String getSql() {
return sql;
}
public void setSql(String sql) {
this.sql = sql;
}
}
如果不用sqlV封装的话,可以将mapper改为${value}:即可以不报错,也可以避免使用SqlVo.java
<!-- ##### 万能SQL原生映射 -zyh ##### -->
<select id="selectBysql" parameterType="String" resultType="java.util.LinkedHashMap">
${value}
</select>
最后service的调用方式:
@Service
public class GiftServiceImpl implements GiftService {
@Autowired
private SQLMapper sqlMapper;
@Override
public List<LinkedHashMap<String, Object>> selectBySQL(Integer sqlStr) {
// TODO Auto-generated method stub
SqlVo sqlVo = new SqlVo();
sqlVo.setSql(sqlStr);
return sqlMapper.selectBysql(sqlVo);
}
}
为了避免出现值null的列,不能被保存到 LinkedHashMap对象 中,需要在mybatis 的配置文件中加如下配置:
<settings>
<!-- 调用setter null,返回空也必须设置到bean中 (直接执行sql专用)-->
<setting name="callSettersOnNulls" value="true"/>
</settings>
如果对您有帮助,请点赞