赞
踩
在某些业务场景下,需要多表联合进行统计操作,而这样的场景下,往往sql的逻辑比较复杂,利用Mybatis很难轻易的写出来,同时,各个业务变数又很大,基于mybatis来处理显得有些鸡肋。有时候不得不写一些纯sql然后传入mybatis,写纯sql传入mybatis的问题在于很难避免被诟病的sql拼接。为了解决这种场景下的矛盾冲突,可以利用下面的方法。
<!--SqlMapper.xml-->
<?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="com.chaojilaji.shengqian.SqlMapper">
<select id="sqltest" parameterType="java.util.Map" resultType="HashMap">
${sql}
</select>
</mapper>
传入的参数类型为Map
// SqlMapper.java
@Mapper
@Component(value = "sqlMapper")
public interface SqlMapper {
List<Map<String,Object>> sqltest(Map<String,Object> map);
}
调用
@Controller public class TestController { @Autowired SqlMapper sqlMapper @RequestMapping(value = "/testsqlmapper", method = RequestMethod.GET) @ResponseBody public String testSqlMapper() { try { Map<String,Object> params = new HashMap<>(); params.put("sql","select count(*) from user where code like #{code}"); params.put("code","1%"); List<Map<String, Object>> ans = sqlMapper.sqltest(params); if (Objects.nonNull(ans) && ans.size() > 0){ System.out.println(ans.get(0)); } } catch (Exception e) { e.printStackTrace(); } return "1"; } }
解释一下,就是,将包括sql在内的所有东西放到Map中,在sql中按照在xml中的写法,把变量写好,然后同时把这些变量也放到Map里面,这样就可以实现参数内绑定。这里需要说一下, # 和 $,这两个占位符的区别,前者可以自动根据参数类型绑定变量,包括添加引号等,后者只是生硬得直接填进去,如果有引号需要自己加。
来看看效果:
和在mybatis中绑定参数是一样的效果。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。