前言🎶
对于我们在开发中很多场景都会遇到一些批量数据的插入操作,这篇文章我会简单展示一下案例和在插入时所注意的事项。
案例🌹
首先看一下我们的Mapper.xml
文件中的批量插入语法。
<insert id="saveBatchFeedback"> insert into t_feedback( <include refid="Base_Column_List"/> ) values <foreach collection="list" separator="," item="item" index="index"> ( #{item.feedbackId,jdbcType=VARCHAR}, #{item.customerId,jdbcType=VARCHAR}, #{item.projectId,jdbcType=VARCHAR}, #{item.moduleName,jdbcType=VARCHAR}, #{item.menuName,jdbcType=VARCHAR}, #{item.feedbackContent,jdbcType=VARCHAR}, #{item.feedbackDept,jdbcType=VARCHAR}, #{item.feedbackUser,jdbcType=VARCHAR}, #{item.requestTime,jdbcType=VARCHAR}, #{item.feedbackFile,jdbcType=VARCHAR}, #{item.feedbackMemo,jdbcType=VARCHAR}, #{item.insertTime,jdbcType=VARCHAR}, #{item.insertUser,jdbcType=VARCHAR} ) </foreach> </insert>
- 首先是
include
标签里是我们定义的字段(我使用的是sql引用,也可以直接在括号中定义),里面的字段数量要和循环赋值里面的字段保持一致
include标签中的内容
<sql id="Base_Column_List"> feedback_id, customer_id, project_id, module_name, menu_name, feedback_content, feedback_dept, feedback_user, feedback_file, request_time, feedback_memo, insert_time, insert_user </sql>
- 我们可以看到
foreach
标签中有一个collection
属性,这对应的是你在Mapper接口
中的类型,如果在Mapper接口中有多个参数的话,对应的值需要使用@Param()
注解来表示。 collection
中的属性值是list
,代表我们在Mapper接口中传过来的类型是list,如果Mapper接口层是array
,则collection
的值必须是array
item
属性值默认为item,可以随便起别名,他的用途是我们可以使用item.
我们在集合或者数组中的属性来进行赋值- 另外可以看到我把
feedback
主键id给放到批量添加语法中了,因为数据库没有使用自增,所以我在集合中对id进行赋值了。(如果你的表注解是自增的话,就不用在批量插入中定义)
如果有对在SQL中公共引用不熟悉的可以去看一下我的这篇文章:
sql字段的公共引用
我们看一下我们的Mapper接口
🐱🚀
//批量添加反馈int saveBatchFeedback(@Param("list") List<TFeedback> list);
因为我们是list集合
来进行批量插入,所以在xml中collection
的属性值为list
然后我们看一下controller
的处理方式🎁
@RequestMapping("saveBatchFeedback") public Message saveBatchFeedback(String feedbackJson) { List<TFeedback> list = JSONArray.parseArray(feedbackJson, TFeedback.class); feedbackMapper.saveBatchFeedback(list); ...... }
可以看到我定义的是一个JSON字符串
,这样的话是比较简单的(因为前端也是我开发的,不会用集合进行传参,菜鸡一个),然后我们将这个JSON串
通过fastjson工具
来转为我们的一个List
集合数据,然后调用Mapper
接口方法进行添加。
JSONArray.parseArray()
第一个参数是我们需要进行转换的JSON字符串
,第二个参数是我们要将这个JSON串转为什么类型。注
:这一步的话很容易出错,我们可以将前端传过来的JSON字符串打个断点,并将字符串的内容复制到在线JSON校验工具
中验证是否为正确的JSON字符串(本人经历😭)。
在线JSON校验地址:在线JSON校验地址
当然我们也可以使用List集合来接受前端发送过来的一个JSON格式的集合,如下👇
@RequestMapping("saveBatchFeedback") public Message saveBatchFeedback(List<TFeedback> feedbacks) { feedbackMapper.saveBatchFeedback(feedbacks); ...... }
这样的话我们就不需要
去将JSON字符串转换为对象了,如果没有其他业务的话,我们可以直接调用
Mapper层接口进行批量添加,前提是前端的JSON字段需要跟你List泛型的类型里的字段保持一致
。
FastJson工具依赖:
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.40</version></dependency>`
小结🐱🐉
这篇文章暂时先分享到这里,如果有不懂的可以看我另一篇Mybatis批量插入
文章:Mybatis批量插入
或者是来私信我要源码都可以。