当前位置:   article > 正文

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

mybatis自定义对象参数

在某些业务场景下,需要多表联合进行统计操作,而这样的场景下,往往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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

传入的参数类型为Map

// SqlMapper.java
@Mapper
@Component(value = "sqlMapper")
public interface SqlMapper {
    List<Map<String,Object>> sqltest(Map<String,Object> map);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

调用

@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";
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

解释一下,就是,将包括sql在内的所有东西放到Map中,在sql中按照在xml中的写法,把变量写好,然后同时把这些变量也放到Map里面,这样就可以实现参数内绑定。这里需要说一下, # 和 $,这两个占位符的区别,前者可以自动根据参数类型绑定变量,包括添加引号等,后者只是生硬得直接填进去,如果有引号需要自己加。

来看看效果:
在这里插入图片描述
和在mybatis中绑定参数是一样的效果。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号