系统在做查询时,多数情况会需要做条件筛选,也就是要传入参数,用参数作为条件去查询,因此处理传入参数就成了一个问题,传入的参数可能是单个基础数据类型的参数,也可能是集合或者是对象等,
如果传入的参数是基础数据类型,可以直接拼接上,例如:
当传入参数为String类型的name时,直接拼接到sql语句上即可,这里要注意区分#{}和${},#是作为占位符预编译的,简单的说,传入的内容会加上单引号只会作为一个值去执行,但是$里的内容会拼接到sql语句中,如果传入的是sql语句也会拼接到此位置,就会存在sql注入的问题,因此正常使用#来做拼接,但是有时候需要动态拼接sql语句的时候也会用到${},但是要处理好防止sql注入的问题。
<select id="getUserByName" parameterType="java.lang.String" resultType="User">
SELECT * FROM sys_user WHERE name = #{name}
</select>
另一种情况是传入的数据为多个值,当传入参数为多个值时有几种方案:
第一种是直接传入多个参数:
List<User> getUsers(@Param("name") String name, @Param("age") int age);
<select id="getUserByName" parameterType="java.lang.String" resultType="User">
SELECT * FROM sys_user WHERE name = #{name} and age = #{age}
</select>
第二种是多个参数放入map后。传入整合map:(这里的name和age,就是map中的key)
<select id="getUsers" parameterType="java.util.Map" resultType="User">
SELECT * FROM users WHERE name = #{name} AND age = #{age}
</select>
第三种是可以设置为对象的属性,传入整个对象:(#{}中的name和age都是User的属性)
<select id="getUsers" parameterType="User" resultType="User">
SELECT * FROM users WHERE name = #{name} AND age = #{age}
</select>
同时传入参数还可能是集合,但是传入的集合一般都是基础数据类型的集合,比如根据多个id进行查询等,这里就要引入一个新的标签<foreach>,实际上是做了一个循环,逐个取出集合中的元素拼接到sql中,
collection
: 指定要遍历的集合或数组的表达式,可以是一个参数、一个属性或者一个 OGNL 表达式。item
: 指定在遍历过程中当前元素的名称。index
: 指定在遍历过程中当前元素的索引,如果不需要索引可以省略。open
: 指定遍历生成的 SQL 片段的开头部分。separator
: 指定遍历生成的 SQL 片段的分隔符部分。close
: 指定遍历生成的 SQL 片段的结束部分。
最终类似{1,2,3}的集合经过处理会成为 (‘1’,2’,‘3’),list集合前后各拼接一个括号,每个元素用,隔开,拼接后的sql就是 SELECT * FROM users WHERE id IN (‘1’,‘2’,‘3’)
<select id="getUsersByIds" parameterType="java.util.List" resultType="User">
SELECT * FROM users WHERE id IN
<foreach item="item" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</select>
以上就是Mybatis常用的所有传入数据类型了。