相关文章推荐

在平时的开发中,我们可能会遇到需要通过遍历一个id集合,然后通过id查询出这些商品,通常,我们可能会一下子就想到直接使用for循环遍历id集合,然后再通过id查询商品,那么如果这样子做,就会在for循环中多次访问数据库,造成程序性能和资源的损耗,当你的id集合大时,需要访问的次数就要很多,然而我们使用foreach循环就可以很好的避免这种情况。

二、应用场景

此处举例通过商品id集合查询商品,可以有两种方法

第一种:使用for循环,遍历id集合,在集合中查询数据库。

@Resource
private ProductMapper productMapper;
    List<Integer> idList=new ArrayList<>();//模拟一个商品id集合,供查询用
    @Test
    public void testFor(){//使用for循环的方式
        idList.add(26);
        idList.add(27);
        idList.add(28);
        idList.add(29);//添加商品id
        long startTime = System.currentTimeMillis();
        for (Integer productId : idList) {//遍历出id,再用id查询数据库,并计算时间
            productMapper.selectByPrimaryKey(productId);
        long endTime=System.currentTimeMillis();
        System.out.println(endTime-startTime);//结果为937秒,共查到四条数据,执行了四次sql语句。

这样子的方式,如果数据很多,那么就得很多次访问数据库,效率十分低下,接下来介绍更好的方式。

第二种:使用foreach+IN的方式,在sql中遍历id,一次性查询

@Test
    public void testForeachIn(){//使用Foreach+IN的方式
        idList.add(26);
        idList.add(27);
        idList.add(28);
        idList.add(29);//添加商品id
        long startTime = System.currentTimeMillis();
        productMapper.selectByPrimaryKeyList(idList);//这里使用for+IN查询数据库,只查询一次就能将所有数据拿出来。
        long endTime=System.currentTimeMillis();
        System.out.println(endTime-startTime);//结果为547

对比之下,比for循环多次查询数据库快了很多,当数据更多时,好处就体现出来了。查看第二个测试的sql语句可以发现秘密所在:如图

 一次性在sql中,将四个id传入,一次性查询出来了,这就是比for循环内一次次访问数据库快的原因。具体的实现如下:

①先在mapper接口中定义一个抽象方法。

* 使用Foreach-In代替for循环查询,提高性能,减少访问数据库次数 * @param idList * @return List<Product> selectByPrimaryKeyList(@Param("idList") List<Integer> idList);

其中@Param("idList")是必要的加的,这里定义注解的值,在sql中要循环这个名字的collection,所以要写好,尽量跟集合参数的名字保持一致。接下来,就是在Mapper.xml中编写对应的sql语句

②编写sql(由mybatis-generator生成)语句

<select id="selectByPrimaryKeyList" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List"/>
        from mall_product
        <where>
            <if test="idList.size()>0">
                id in
                <foreach collection="idList" item="id" index="index" open="(" close=")" separator=",">
                    #{id}
                </foreach>
        </where>
    </select>

其中,当idList.size()>0时,就执行where条件,当遍历idList集合,item代表集合内元素,collection为@Param注解的value,格式要为#{},这样子就可以实现一次查询多条数据,并封装到集合中,List集合和Set集合根据具体需求选择。

以上就是两种方式的对比以及Foreach+IN的使用方式。

一、引言 在平时的开发中,我们可能会遇到需要通过遍历一个id集合,然后通过id查询出这些商品,通常,我们可能会一下子就想到直接使用for循环遍历id集合,然后再通过id查询商品,那么如果这样子做,就会在for循环中多次访问数据库,造成程序性能和资源的损耗,当你的id集合大时,需要访问的次数就要很多,然而我们使用foreach循环就可以很好的避免这种情况。二、应用场景此处举例通过商品id集合查询商品,可以有两种方法第一种:使用for循环,遍历id集合,在集合中查询数据库。@Reso..
Mybatisforeach的主要用在构建in条件,它可以在SQL语句进行迭代一个集合。 foreach元素的属性主要有item,index,collection,open,separator,close:     item:表示集合一个元素进行迭代时的别;     index:指定一个名字,用于表示在迭代过程,每次迭代到的位置;     open:表示该语句以什么开...
一、写在前面 MyBatis 动态 SQL一个常用的操作需求是对一个集合进行遍历,通常是在构建 IN 条件语句的时候。foreach允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。foreach 是动态SQL 一个非常强大的标签。下面就来体验一下foreach 标签带来的便捷之处,有关批量操作的实现,这里以批量插入数据为例。 二、foreach遍历...
代码,复制过来直接使用 <select id="selectByIds" resultType="user" parameterType="list"> select * from user <where> <foreach collection="list" open="id in (" close=")" item="id" separator=","&gt
文章目录一、背景二、错误sql示例三、改正后的sql为:四、参考链接: mybatis语法掌握不熟,在写foreach操作时,造成in ()错误,这种情况不符合SQL的语法,导致程序报错。 如果简单只做非空判断,这样也有可能会有问题:本来in一个空列表,应该是没有数据才对,却变成了获取全部数据! 二、错误sql示例 &lt;select id="getActiveCount" resu...
这里有两张表,表关系一对多,开发常见的需求: 先分页查询出user表下的n条数据,再关联查询出note表与之关联的表 比如:分页查询 每页10条用户(user)数据,返回结果需要携带每个用户发表的笔记(note) 2.菜鸟(我)的写法 这段代码只需要关注间的查询过程 1.先进行分页查询,拿到全部的10条(user)数据。 2.使用循环查询每一条User下的全部note数据 item:集合元素迭代时的别名(必选) index:用于表示在迭代过程,每次迭代到的位置(可选) open:开始符号,一般是(和close=")"合用。常用在in(),values()时(可选) separator:元素之间的分隔符,在in()的时候,separator=","会自动在元素间用“,“隔开,如in(1,2,)(可选) close:
List<User> selectByIdSet(@Param("idList")List<Integer> idList); <select id="selectByIdSet" resultMap="BaseResultMap"> SELECT <include refid="Base_Column_List" /> from t_user WHERE id IN <foreach collection=".
1.  对于 需要 使用mybatis的foreach功能生成的 批量操作语句 比如:   select * from  user  n where ( ? in n.tags , ? in n.tags   )      分解 在mybatis的xml文件就是                 select * from user m where
sqlforeach标签使用 1、mybatis动态sqlforeach标签使用 2、解决了SQL语句使用where 条件 in (字段)的问题 3、文件夹和文档关联,不使用循环遍历,用一条sql语句查询所有文件夹及子文件夹folderIds对应的文档。 foreach标签主要用于构建in条件,他可以在sql对集合进行迭代。如下: <select id="selectByF...
在 JavaScript ,`forEach`、`for...of`、`for...in` 循环是不支持跳出循环的。因为它们是迭代器循环,无法使用 `break` 或 `continue` 语句跳出循环。 但是,可以使用 `some`、`every`、`find`、`findIndex` 等数组方法来实现跳出循环的效果。例如: 1. 使用 `some` 方法: const arr = [1, 2, 3, 4, 5]; arr.some(item => { console.log(item); if (item === 3) { return true; // 跳出循环 2. 使用 `find` 方法: const arr = [1, 2, 3, 4, 5]; arr.find(item => { console.log(item); if (item === 3) { return true; // 跳出循环 3. 使用 `for` 循环: const arr = [1, 2, 3, 4, 5]; for (let i = 0; i < arr.length; i++) { console.log(arr[i]); if (arr[i] === 3) { break; // 跳出循环 需要注意的是,以上方法只适用于数组类型。对于其他类型的迭代器循环,可以使用 `return` 语句实现跳出循环的效果。
关于Mysql版本升级迁移数据库时报Error Code: 3554 - Access to system table ‘mysql.innodb_index_stats‘ is rejected错误 Dsh6666666: 浅谈Mysql数据库 m0_62444721: 哇哦,好详细哦!!!! 2021-09-29 java命名规范、常量、变量简记 小蔡学编程: 表情包第一次,写的不好😂,电脑格式好好的,到手机看就不对劲了害 2021-09-29 java命名规范、常量、变量简记 m0_62444721:
 
推荐文章