使用Mybatis向MySQL批量插入数据

本文介绍了使用Mybatis向MySQL批量插入数据的两种方法。方法一是通过Map和MyBatis的foreach标签实现,方法二是通过在Java代码中拼接SQL字符串,减少MyBatis的参数解析,提高效率。但第二种方法可能引入SQL注入风险,需要谨慎使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库开发过程中经常会遇到需要批量插入数据的问题,比如:需要对一个文件执行解析入库的操作;
本文以Mybatis的foreach为例,(假定Mybatis环境已经配置好)向MySQL中批量插入数据;

方法一:
1. dao中设置要插入的数据;

public int insertRecordsFromList(List<LoginLog> list){
        Map<String, List<LoginLog> > map = new HashMap<String, List<LoginLog> >();
        map.put("loginlogs", list);
        int num = 
            sqlSessionTemplate.insert(LOGIN_LOG_NAMESPACE + "insertRecordsFromList", map);
        return num;
    }

其中list中为待插入的数据,接下来将list放到map中去(之所以这样做,是因为我刚开始是直接传list,会报错);

2.sqlmap里面如下:

 <select id="insertRecordsFromList" parameterType="java.util.Map">
        insert into t_login_log (login_log_id, user_id, ip,login_datetime) values
        <foreach collection="loginlogs" item="item" index="index" separator=","> 
            (#{item.loginLogId,jdbcType=DECIMAL},
            #{item.userId,jdbcType=DECIMAL},
            #{item.ip,jdbcType=VARCHAR},
            #{item.loginDatetile,jdbcType=VARCHAR})
        </foreach>
    </select>

collection的值即为dao中设置的map的key;分隔符用“,”,组成类似如下的sql:

insert into table_name (col1, col2) values
(val1, val2),
(val11,val22);

如此即可实现向数据库中批量插入数据了;

方法二:
对于方法一,如果数据量比较大的情况,数据解析入库的数据会很慢,计算资源主要消耗在MyBatis解析foreach里面的参数里了,这里提供另外一种方法,避免MyBatis频繁解析参数给程序带来的性能消耗;
方法很简单,即在java代码中把要插入的数据拼接成字符串,例如方法一中提到的SQL语句 insert into table_name(col1,col2)values(val1, val2),
(val11,val22); 拼接的字符串如下 “(val1,val2),(val11,val22)”。SqlMap里如下:

<select id="batchInsert" parameterType="java.util.Map">
        insert into t_login_log (login_log_id, user_id, ip,login_datetime)  values
        ${details}<!--此处为拼接sql,用"$",而不用"#",用"#"会在参数上自动加上双引号,在此处会报错误,其中details为拼接的记录  -->
    </select> 

即把要插入的记录拼接成一个字符串,MyBatis只解析这一个字符串。这种方式在数据量比较大的情况下,相比于方法一,效率有很大的提升;
不过这个方法会带来另外一个问题:由于使用“$”进行直接拼接SQL语句,会有SQL注入的风险,所以具体项目中采用哪种方式,还需要自己权衡。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值