@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..
Mybatis中的foreach的主要用在构建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=",">
文章目录一、背景二、错误sql示例三、改正后的sql为:四、参考链接:
mybatis语法掌握不熟,在写foreach操作时,造成in ()错误,这种情况不符合SQL的语法,导致程序报错。
如果简单只做非空判断,这样也有可能会有问题:本来in一个空列表,应该是没有数据才对,却变成了获取全部数据!
二、错误sql示例
<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
sql中foreach标签的使用
1、mybatis动态sql中foreach标签的使用
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: