我们都知道,在Mybatis中的Mapper.xml映射文件可以定制动态SQL,在dao层定义的接口中定义的参数传到xml文件中之后,在查询之前mybatis会对其进行动态解析,通常使用#{}接收,下面介绍几种比较常用的用法。
前言#{}与${}区别
#{} 在SQL动态解析之后,编译将#{}替换为占位符?去替换参数,可以防止sql注入;
#{} 只是表示占位,与参数的名字无关,如果只有一个参数会自动对应,下面会介绍多个参数的问题;
${} 是进行字符串拼接,直接取出参数值,放到sql语句中;
使用注意点,当表名作为变量时,必须使用${}获取参数作为表名进行查询,否则会出现语法错误;
总结:
- sql语句动态生成的时候,使用${}
- sql语句中某个参数进行占位的时候用#{}
接收多个参数
遇到这个问题是在昨天实现分页的时候接收参数时遇到了错误,最后用第一种方法解决,但是怀着路漫漫其修远兮的态度,吾必将上下而求索其他用法,所以在查询了网上很多教程和mybatis官方文档,总结出以下四种常用用法;
具体分页参考:
手动实现分页 或
手动分页
- 使用arg0,arg1或使用param1,param2接收(arg索引从0开始,param索引从1开始);
- 多个参数封装成对象;
- 多个参数封装成Map集合;
- 使用@param绑定参数;
下面分别介绍
看传来的参数:
1 | public interface CustomerDao { |
第一种方法:使用arg或param
1 | <mapper namespace="com.vue.dao.CustomerDao"> |
或
1 | <mapper namespace="com.vue.dao.CustomerDao"> |
第二种方法:封装成对象
Page.java
1 | public class Page { |
传参:
控制层封装前台传来的page信息
1 |
|
service层:
1 | public interface CustomerService{ |
持久层传参:
1 | public interface CustomerDao { |
mapper.xml映射文件
1 | <mapper namespace="com.vue.dao.CustomerDao"> |
第三种方法:封装成Map集合
传参:
控制层封装前台传来的page信息
1 |
|
service层:
1 | public interface CustomerService{ |
持久层传参:
1 | public interface CustomerDao { |
mapper.xml映射文件
1 | <mapper namespace="com.vue.dao.CustomerDao"> |
第四种方法:使用@Param绑定参数
1 | public interface CustomerDao { |
mapper.xml映射文件
1 | <mapper namespace="com.vue.dao.CustomerDao"> |