mybatis实现⾃定义sql参数化,并绑定参数内参数
在某些业务场景下,需要多表联合进⾏统计操作,⽽这样的场景下,往往sql的逻辑⽐较复杂,利⽤Mybatis很难轻易的写出来,同时,各个业务变数⼜很⼤,基于mybatis来处理显得有些鸡肋。有时候不得不写⼀些纯sql然后传⼊mybatis,写纯sql传⼊mybatis的问题在于很难避免被诟病的sql拼接。为了解决这种场景下的⽭盾冲突,可以利⽤下⾯的⽅法。
<!--l-->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-////DTD Mapper 3.0//EN"
"/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);
Null(ans)&& ans.size()>0){
System.out.(0));
}
}catch(Exception e){
e.printStackTrace();sql自学难吗
}
return"1";
}
}
解释⼀下,就是,将包括sql在内的所有东西放到Map中,在sql中按照在xml中的写法,把变量写好,
然后同时把这些变量也放到Map⾥⾯,这样就可以实现参数内绑定。这⾥需要说⼀下, # 和 $,这两个占位符的区别,前者可以⾃动根据参数类型绑定变量,包括添加引号等,后者只是⽣硬得直接填进去,如果有引号需要⾃⼰加。
来看看效果:
和在mybatis中绑定参数是⼀样的效果。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论