mybatis 实现自定义sql参数化,并绑定参数内参数

时间:2019-03-18
本文章向大家介绍mybatis 实现自定义sql参数化,并绑定参数内参数,主要包括mybatis 实现自定义sql参数化,并绑定参数内参数使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

在某些业务场景下,需要多表联合进行统计操作,而这样的场景下,往往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中绑定参数是一样的效果。