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


谢谢!!!

相关文章
|
8天前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过使用 MongoDB Connector for BI 和 JDBC,开发者可以在 Java 中使用 SQL 语法查询 MongoDB 数据库。这种方法对于熟悉 SQL 的团队非常有帮助,能够快速实现对 MongoDB 数据的操作。同时,也需要注意到这种方法的性能和功能限制,根据具体应用场景进行选择和优化。
33 9
|
29天前
|
SQL 存储 人工智能
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
Vanna 是一个开源的 Python RAG(Retrieval-Augmented Generation)框架,能够基于大型语言模型(LLMs)为数据库生成精确的 SQL 查询。Vanna 支持多种 LLMs、向量数据库和 SQL 数据库,提供高准确性查询,同时确保数据库内容安全私密,不外泄。
102 7
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
|
15天前
|
SQL XML Java
mybatis实现动态sql
MyBatis的动态SQL功能为开发人员提供了强大的工具来应对复杂的查询需求。通过使用 `<if>`、`<choose>`、`<foreach>`等标签,可以根据不同的条件动态生成SQL语句,从而提高代码的灵活性和可维护性。本文详细介绍了动态SQL的基本用法和实际应用示例,希望对您在实际项目中使用MyBatis有所帮助。
46 11
|
13天前
|
XML Java 数据库连接
Mybatis实现RBAC权限模型查询
通过对RBAC权限模型的理解和MyBatis的灵活使用,我们可以高效地实现复杂的权限管理功能,为应用程序的安全性和可维护性提供有力支持。
47 5
|
2月前
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
39 8
|
1月前
|
SQL Java 数据库连接
spring和Mybatis的各种查询
Spring 和 MyBatis 的结合使得数据访问层的开发变得更加简洁和高效。通过以上各种查询操作的详细讲解,我们可以看到 MyBatis 在处理简单查询、条件查询、分页查询、联合查询和动态 SQL 查询方面的强大功能。熟练掌握这些操作,可以极大提升开发效率和代码质量。
57 3
|
2月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
2月前
|
SQL 安全 Java
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
39 1
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
|
2月前
|
SQL 安全 PHP
PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全
本文深入探讨了PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全。
63 4
|
2月前
|
SQL 监控 关系型数据库
SQL语句当前及历史信息查询-performance schema的使用
本文介绍了如何使用MySQL的Performance Schema来获取SQL语句的当前和历史执行信息。Performance Schema默认在MySQL 8.0中启用,可以通过查询相关表来获取详细的SQL执行信息,包括当前执行的SQL、历史执行记录和统计汇总信息,从而快速定位和解决性能瓶颈。