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 的常见用法。


谢谢!!!

相关文章
|
10月前
|
SQL 监控 关系型数据库
一键开启百倍加速!RDS DuckDB 黑科技让SQL查询速度最高提升200倍
RDS MySQL DuckDB分析实例结合事务处理与实时分析能力,显著提升SQL查询性能,最高可达200倍,兼容MySQL语法,无需额外学习成本。
|
10月前
|
SQL 存储 关系型数据库
MySQL体系结构详解:一条SQL查询的旅程
本文深入解析MySQL内部架构,从SQL查询的执行流程到性能优化技巧,涵盖连接建立、查询处理、执行阶段及存储引擎工作机制,帮助开发者理解MySQL运行原理并提升数据库性能。
|
SQL 数据挖掘 数据库
第三篇:高级 SQL 查询与多表操作
本文深入讲解高级SQL查询技巧,涵盖多表JOIN操作、聚合函数、分组查询、子查询及视图索引等内容。适合已掌握基础SQL的学习者,通过实例解析INNER/LEFT/RIGHT/FULL JOIN用法,以及COUNT/SUM/AVG等聚合函数的应用。同时探讨复杂WHERE条件、子查询嵌套,并介绍视图简化查询与索引优化性能的方法。最后提供实践建议与学习资源,助你提升SQL技能以应对实际数据处理需求。
985 1
|
SQL Java 数据库连接
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
|
SQL Java 数据库连接
MyBatis动态SQL字符串空值判断,这个细节99%的程序员都踩过坑!
本文深入探讨了MyBatis动态SQL中字符串参数判空的常见问题。通过具体案例分析,对比了`name != null and name != &#39;&#39;`与`name != null and name != &#39; &#39;`两种写法的差异,指出后者可能引发逻辑混乱。为避免此类问题,建议在后端对参数进行预处理(如trim去空格),简化MyBatis判断逻辑,提升代码健壮性与可维护性。细节决定成败,严谨处理参数判空是写出高质量代码的关键。
1887 0
|
10月前
|
SQL 监控 关系型数据库
SQL优化技巧:让MySQL查询快人一步
本文深入解析了MySQL查询优化的核心技巧,涵盖索引设计、查询重写、分页优化、批量操作、数据类型优化及性能监控等方面,帮助开发者显著提升数据库性能,解决慢查询问题,适用于高并发与大数据场景。
|
11月前
|
SQL XML Java
通过MyBatis的XML配置实现灵活的动态SQL查询
总结而言,通过MyBatis的XML配置实现灵活的动态SQL查询,可以让开发者以声明式的方式构建SQL语句,既保证了SQL操作的灵活性,又简化了代码的复杂度。这种方式可以显著提高数据库操作的效率和代码的可维护性。
600 18
|
9月前
|
SQL 关系型数据库 MySQL
(SQL)SQL语言中的查询语句整理
查询语句在sql中占了挺大一部分篇幅,因为在数据库中使用查询语句的次数远多于更新与删除命令。而查询语句比起其他语句要更加的复杂,可因为sql是数据库不可或缺的一部分,所以即使不懂,也必须得弄懂,以上。
472 0
|
SQL XML Java
MyBatis Mapper中使用limit参数的查询问题
总结而言,MyBatis中使用 `limit`参数的查询可以高度定制并且灵活,基于方法签名和XML映射文件的组合来达成多样化的查询需求。通过参数化查询和动态SQL,MyBatis可以有效地处理各种复杂情境下的数据库操作,并且将SQL语句的维护与业务代码的编写相分离,提升代码的可维护性和可阅读性。
884 13
|
SQL 关系型数据库 MySQL
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路