MyBatis的动态Sql查询(七)下

简介: MyBatis的动态Sql查询(七)中

七. 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));
  }


20190704194039680.png


七.二 集合形式


接口:


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));
  }


20190704195001713.png


七.三 多值时 用@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));
  }


20190704195321930.png


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));
  }


20190704195736766.png


这就是 bind 的常见用法。


谢谢!!!

相关文章
|
7天前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
12天前
|
SQL 安全 Java
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
11 1
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
|
9天前
|
SQL 存储 缓存
如何优化SQL查询性能?
【10月更文挑战第28天】如何优化SQL查询性能?
47 10
|
3天前
|
SQL 关系型数据库 MySQL
|
17天前
|
SQL 数据库 开发者
功能发布-自定义SQL查询
本期主要为大家介绍ClkLog九月上线的新功能-自定义SQL查询。
|
18天前
|
SQL Java 数据库连接
mybatis如何仅仅查询某个表的几个字段
【10月更文挑战第19天】mybatis如何仅仅查询某个表的几个字段
20 1
|
30天前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
30 10
|
24天前
|
SQL 移动开发 Oracle
SQL语句实现查询连续六天数据的方法与技巧
在数据库查询中,有时需要筛选出符合特定时间连续性条件的数据记录
|
1月前
|
SQL Java 数据库连接
如何使用`DriverManager.getConnection()`连接数据库,并利用`PreparedStatement`执行参数化查询,有效防止SQL注入。
【10月更文挑战第6天】在代码与逻辑交织的世界中,我从一名数据库新手出发,通过不断探索与实践,最终成为熟练掌握JDBC的开发者。这段旅程充满挑战与惊喜,从建立数据库连接到执行SQL语句,再到理解事务管理和批处理等高级功能,每一步都让我对JDBC有了更深的认识。示例代码展示了如何使用`DriverManager.getConnection()`连接数据库,并利用`PreparedStatement`执行参数化查询,有效防止SQL注入。
76 5
|
1月前
|
SQL 数据挖掘 数据库
SQL查询每秒的数据:技巧、方法与性能优化
id="">SQL查询功能详解 SQL(Structured Query Language,结构化查询语言)是一种专门用于与数据库进行沟通和操作的语言

热门文章

最新文章

下一篇
无影云桌面