mybatis mysql foreach_基于mysql对mybatis中的foreach进行深入研究

本文深入研究 MyBatis 中的 `foreach` 指令,通过示例介绍了如何在 MySQL 中进行数据插入和查询。涉及的场景包括 `selectKey` 方案与 `useGeneratedKeys="true"` 方案的批量插入,并对 `list`、`map` 和 `array` 三种类型的集合进行了案例分析。在实践中,详细解析了 `foreach` 中的 `collection`、`index` 等属性的使用,并给出实际代码示例。
摘要由CSDN通过智能技术生成

鉴于上一篇博文一次修改mysql字段类型引发的技术探究提到的,要对foreach里面的collection相关的内容做一些介绍,今天就围绕foreach,做一些数据插入和查询相关的研究。

首先介绍一下我的环境:

1. linux redhat7

2. mysql 5.6

3. java7

4. mybatis 3.2.7 (后来遇到问题,更新到3.3.1)

第一步,在数据库中创建测试用的表 foreach_test。如下:

mysql>desc foreach_test;+-------+-------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+----------------+

| id | int(11) | NO | PRI | NULL | auto_increment |

| name | varchar(32) | YES | | NULL | |

| age | int(8) | YES | | NULL | |

| idx | int(4) | YES | | NULL | |

+-------+-------------+------+-----+---------+----------------+

4 rows in set (0.00 sec)

第二步,进行mybatis相关的mapper以及dao进行配置。今天研究和介绍的关于foreach的相关内容,将从insert以及select两个大类进行案例介绍,其中,insert是重点,因为批量数据插入,相对比较复杂点,涉及到键值的更新过程。对于mysql数据库而言,对于第一步中创建的数据表foreach_test,有一个主键id,是数字自增型的。这里,结合mybatis的官方文档介绍,将会有两种更新主键的方法:selectKey,以及useGeneratedKeys=“true”下面将结合这两种方法,以及foreach的collection能够支持的三种集合类型list,array以及map进行案例分析。

1. selectKey方案的插入,数据采用list传入

mapper的sql语句:

SELECT LAST_INSERT_ID()insert into foreach_test (name, age, idx) values(#{st.name, jdbcType=VARCHAR}, #{st.age, jdbcType=INTEGER}, #{idx})

dao层的接口:

int foreachSelectKeyInsert(List dud);

java业务逻辑:

@GET

@Path("/foreach/selectkey/insert")publicString foreachSelectKeyInsert(@Context HttpServletRequest req){

List dud = new ArrayList();for(int i=1; i < 5; i++){

Du du1= newDu();

du1.setName("SelectKey" +i);

du1.setAge(30+i);

dud.add(du1);

}

pes.foreachSelectKeyInsert(dud);return "SelectKey Insert OK";

}

在地址栏输入:

http://10.90.9.20:8080/ecs/demo/foreach/selectkey/insert

数据库中得到:

mysql> select * fromforeach_test;+----+------------+------+------+

| id | name | age | idx |

+----+------------+------+------+

| 1 | SelectKey1 | 31 | 0 |

| 2 | SelectKey2 | 32 | 1 |

| 3 | SelectKey3 | 33 | 2 |

| 4 | SelectKey4 | 34 | 3 |

+----+------------+------+------+

4 rows in set (0.00 sec)

2. useGeneratedKeys=”true“方案的插入,数据采用list传入

mapper的sql语句:

insert into foreach_test (name, age, idx) values(#{st.name, jdbcType=VARCHAR}, #{st.age, jdbcType=INTEGER}, #{idx})

dao接口:

int foreachUseGeneratedKeysInsert1(List dud);

java业务逻辑:

@GET

@Path("/foreach/usegeneratedkeys/insert1")publicString foreachUseGeneratedKeysInsert1(@Context HttpServletRequest req){

List dud = new ArrayList();for(int i=6; i < 10; i++){

Du du1= newDu();

du1.setName("UseGeneratedKeys1" +i);

du1.setAge(30+i);

dud.add(du1);

}

pes.foreachUseGeneratedKeysInsert1(dud);return "UseGeneratedKeys1 Insert OK";

}

在地址栏输入:

http://10.90.9.20:8080/ecs/demo/foreach/usegeneratedkeys/insert1

结果爆出错误:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

org.apache.ibatis.binding.BindingException: Parameter 'id'not found. Available parameters are [list]

at org.apache.ibatis.session.defaults.DefaultSqlSession$StrictMap.get(DefaultSqlSession.java:261)

at org.apache.ibatis.reflection.wrapper.MapWrapper.getSetterType(MapWrapper.java:79)

at org.apache.ibatis.reflection.MetaObject.getSetterType(MetaObject.java:91)

at org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator.getTypeHandlers(Jdbc3KeyGenerator.java:82)

at org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator.processBatch(Jdbc3KeyGenerator.java:61)

at org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator.processAfter(Jdbc3KeyGenerator.java:45)

at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:48)

at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:69)

at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:48)

at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:105)

at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:71)

at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:152)

at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:141)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:606)

at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:358)

at com.sun.proxy.$Proxy11.insert(Unknown Source)

at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:240)

at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:51)

at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:52)

at com.sun.proxy.$Proxy32.foreachUseGeneratedKeysInsert1(Unknown Source)

at com.tg.ecs.ucc.service.impl.PurchaseElementService.foreachUseGeneratedKeysInsert1(PurchaseElementService.java:116)

at com.tg.ecs.ucc.service.impl.PurchaseElementS

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatisforeach语句主要用于迭代集合,并在实际应用场景解决批量查询、批量删除和批量编辑等操作。该语句的基本语法包括以下6个参数: 1. item:表示集合每一个元素进行迭代时的别名; 2. index:表示索引; 3. collection:表示要迭代的集合; 4. open:表示前缀的拼接内容; 5. separator:表示迭代集合时的分隔符; 6. close:表示后缀的拼接内容。 通过使用foreach语句,我们可以在Mybatis完成各类批量操作,如批量插入表数据和批量更新表数据。在批量插入表数据的例子,我们可以使用foreach来循环遍历一个集合,并将集合的元素按照指定的格式插入到表。而在批量更新表数据的例子,我们可以使用foreach来生成一个包含多个条件的IN子查询。 总之,Mybatisforeach语句是一个非常实用的工具,可以在多种业务场景下提高执行效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Mybatisforeach语句简介](https://blog.csdn.net/imVainiycos/article/details/99304321)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Mybatis标签<foreach>详解](https://blog.csdn.net/qq_36631553/article/details/105680200)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值