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

当面对多表联合统计的复杂SQL需求时,Mybatis的便利性显得不足。本文介绍了一种通过Map参数动态传入SQL的方法,避免了SQL拼接的弊端。在SqlMapper.xml中定义了一个select标签,接受Map参数,然后在Java接口中定义相应方法,通过Map传入SQL和变量。在实际调用时,将SQL语句和变量放入Map中,实现了类似Mybatis参数绑定的效果,简化了复杂查询的处理。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值