mybatis批量insert该怎么实现?都有几种实现方式?

TheDisguiser 2020-05-13 20:53:31 java常见问答 4114

Mybatis是数据库应用不可缺少的框架之一,下面要给大家介绍的就是mybatis中如何实现批量insert,一起来看看吧。

Mybatis常用批量insert

通常来说,myBatis批量插入数据到数据库一般会有两种方式:

1. xml方式

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper
    namespace="com.xxx.mapper.XXXRecordMapper">
    <resultMap id="BaseResultMap" type="com.xxx.model.XXXRecord">
        <id column="AutoId" property="autoid" jdbcType="BIGINT" />
        <result column="UserId" property="userid" jdbcType="BIGINT" />
        <result column="NoticedTime" property="noticedtime" jdbcType="TIMESTAMP" />
    </resultMap>
    <sql id="Base_Column_List">
        AutoId, UserId, NoticedTime
    </sql>
    <!-- myself:批量插入 -->
    <insert id="insertBatch" parameterType="java.util.List">
        insert into T_XXXRecord (AutoId, UserId, NoticedTime) values
        <foreach collection="list" item="item" index="index" separator=",">
            (#{item.autoid,jdbcType=BIGINT},
             #{item.userid,jdbcType=BIGINT},
             #{item.noticedtime,jdbcType=TIMESTAMP})
        </foreach>
    </insert>
</mapper>

注:

collection属性:

1.如果传入的是单参数且参数类型是一个List的时候,collection属性值为list

2.如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array

3.如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map

2.注解方式:

这里我们需要在mapper接口中的方法上使用@InsertProvider注解:

@InsertProvider(type = BatchInsertDevice.class, method = "batchInsertDevice")
void batchInsertDevice(@Param("list") ListdevList);

由于void batchInsertDevice(@Param("list")ListdevList)中的参数是List并指定名称为list故type参数中BatchInsertDevice类中batchInsertDevice方法的参数必须是Map<string,list>类型(可能是mybatis自动做了转换,若参数不为Map<string,list>会出现Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4cdac0de]

Parameter 'arg0' not found. Available parameters are [collection,list]异常)

public String batchInsertDevice(Map < string, list > map)
{
    System.out.println("batchInsertDevice");
    // 获取真正的参数
    ListdevList = map.get("list");
    StringBuilder sql = new StringBuilder();
    sql.append("insert into device ");
    sql.append("(IMEI,deviceDetail) values");
    for (int i = 0; i < devList.size(); i++)
    {
        //这里的list为在map中的key值
        sql.append("(#{list[+" + i + "].IMEI},#{list[" + i + "].deviceDetail}");
        if (i != devList.size() - 1)
        {
            sql.append(",");
        }
        else
            sql.append(";");
    }
    System.out.println(sql.toString());
    return sql.toString();
}

最后在service类上添加@Transactional注解就ok了。

以上就是mybatis批量插入数据的两种方式,你学会了吗?想了解更多java常见问答知识,可以来关注我们的网站噢。

推荐阅读:

mybatis分页插件(实现)

mybatis批量查询如何实现?mybatis批量删除如何实现

mybatis模糊查询要如何实现?有哪些方法?