七. foreach 查询
在数据库中查询的话, 常常会查询id 的集合,进行批量的查询。 常见的形式有 数组 和List 集合的形式。 遍历查询,用的是 foreach .
属性有:
collection 为集合, item 为循环的变量, index 为索引, open 为开始, close 为结束,separator 为分隔符。
如果是单个的数组, 那么可以 collection=“array”,
如果是单个的集合,那么可以 collection=“list”
如果是多个的话,那么可以用Map 或者是@Param 注解进行传参。
七.一 数组形式
接口:
//数组形式 List<User> findAllF6(Integer[] ids);
sql语句:
<select id="findAllF6" parameterType="list" resultMap="userResultMap"> select * from user t <where> id in <foreach collection="array" item="id" index="index" open="(" separator="," close=")"> #{id} </foreach> </where> </select>
测试方法:
@Test public void findAllF61Test(){ SqlSession sqlSession=SqlSessionFactoryUtils.getSession(); UserMapper userMapper=sqlSession.getMapper(UserMapper.class); List<User> allList=userMapper.findAllF6(new Integer[]{1,3,4,5}); allList.forEach(n ->System.out.println(n)); }
七.二 集合形式
接口:
List<User> findAllF6(List<Integer> ids);
sql 语句:
<select id="findAllF6" parameterType="list" resultMap="userResultMap"> select * from user t <where> id in <foreach collection="list" item="id" index="index" open="(" separator="," close=")"> #{id} </foreach> </where> </select>
测试方法:
@Test public void findAllF6Test(){ SqlSession sqlSession=SqlSessionFactoryUtils.getSession(); UserMapper userMapper=sqlSession.getMapper(UserMapper.class); List<Integer> ids=Arrays.asList(1,3,4); List<User> allList=userMapper.findAllF6(ids); allList.forEach(n ->System.out.println(n)); }
七.三 多值时 用@Param 注解
接口:
List<User> findAllF6(@Param(value="ids") List<Integer> ids, @Param(value="sexs") List<String> sexs);
sql 语句:
<select id="findAllF6" parameterType="list" resultMap="userResultMap"> select * from user t <where> id in <foreach collection="ids" item="id" index="index" open="(" separator="," close=")"> #{id} </foreach> and sex in <foreach collection="sexs" item="sex" index="index" open="(" separator="," close=")"> #{sex} </foreach> </where> </select>
测试方法:
@Test public void findAllF62Test(){ SqlSession sqlSession=SqlSessionFactoryUtils.getSession(); UserMapper userMapper=sqlSession.getMapper(UserMapper.class); List<Integer> ids=Arrays.asList(1,3,4); List<String> sexs=Arrays.asList("男","女"); List<User> allList=userMapper.findAllF6(ids,sexs); allList.forEach(n ->System.out.println(n)); }
foreach 的用法很重要。
八. bind 绑定
通过OGNL 表达式定义一个上下文变量,方便我们使用。 如字符串拼接时, mysql 中拼接是 concat() 函数,而oracle 是 || 进行拼接, 这样可以在用 like 语句时要根据不同的数据库来更新语句。 而 bind 语句则解决了这种问题。
接口:
List<User> findAllF7(@Param(value="name") String name,@Param(value="description") String description);
sql 语句:
<select id="findAllF7" parameterType="list" resultMap="userResultMap"> select * from user t <where> <!-- 先定义变量 pattern_name 和pattern_description --> <bind name="pattern_name" value="'%'+name+'%'"/> <bind name="pattern_description" value="'%'+description+'%'"/> <if test="name!=null and name!=''"> <!-- 引入变量 pattern_name --> and name like #{pattern_name} </if> <if test="description!=null and description!=''"> <!-- 引入变量 pattern_description --> and description like #{pattern_description} </if> </where> </select>
测试方法:
@Test public void findAllF7Test(){ SqlSession sqlSession=SqlSessionFactoryUtils.getSession(); UserMapper userMapper=sqlSession.getMapper(UserMapper.class); List<User> allList=userMapper.findAllF7("蝴蝶","蝴蝶"); allList.forEach(n ->System.out.println(n)); }
这就是 bind 的常见用法。
谢谢!!!