背景
在开发过程中遇到一个需求:希望从数据库中读取预先定义好的sql,根据传参进行参数预处理后执行sql语句。结合项目实际情况我决定使用mybatis执行预定义sql。
实现过程
- 缓存我们自定义的sql语句
MappedStatement ms = new MappedStatement.Builder(configuration, msId, sqlSource, SqlCommandType.SELECT)
.resultMaps(new ArrayList<ResultMap>() {
{
add(new ResultMap.Builder(configuration, "defaultResultMap", resultType, new ArrayList<ResultMapping>(0)).build());
}
})
.build();
- 找到我们自定义的sql语句,进行查询
public List<Map<String, Object>> selectList(String sql, Object value) {
log.info("selectList sql:{},params:{}", sql, JSONUtil.toJsonStr(value));
Class<?> parameterType = value != null ? value.getClass() : null;
String msId = mapperStatementBuilder.selectDynamic(sql, parameterType);
return sqlSession.selectList(msId, value);
}
使用说明
public static void main(String[] args) {
// 1. 创建SqlSessionFactory 仅作示意,具体情况具体操作
Configuration configuration = new Configuration();
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
RowSqlMapper rowSqlMapper = new RowSqlMapper(sqlSessionFactory.openSession());
List<Map<String, Object>> maps = rowSqlMapper.selectList("select * from ir_session_param");
HashMap<String, Object> params = new HashMap<>();
params.put("id", "111");
List<Map<String, Object>> maps1 = rowSqlMapper.selectList("<script> select * from temp_table where id = #{id} <if test= \"dept_name != null\">" +
" and dept_name= #{dept_name} </if> </script>", params);
}
总结
文章参考 http://blog.csdn.net/isea533/article/details/40044417,感谢大佬的方案。在使用过程中发现问题可以下方评论。如果文章对你有帮助请点赞分享加关注。代码包免费下载