mybatis 批量插入mysql数据并根据唯一索引做自动去重判断的插入语句

声明:

此处为mybatis 操作mysql数据库实现批量插入。再根据表的唯一索引来判断数据是否重复,如果重复则更新,如果不重复则新增的xml写法

注意:

首先在表中创建可以确认数据唯一性的唯一索引:

例如:UNIQUE KEY `unionIndex` (`keyword_id`,`the_day`) USING BTREE,

dao层

import com.rrc.marketing.core.po.sem.SemKeywordReportBaiduEntity;
import com.rrc.marketing.core.po.sem.SemKeywordTypeBaiduEntity;
import com.rrc.marketing.core.util.MyMapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @Auther:qixin
 * @Date: 2018/10/28 14:52
 * @Description:
 */
public interface SemKeywordReportBaiduDao extends MyMapper<SemKeywordReportBaiduEntity> {
    //批量插入并去重
    void duplicateInsertList(@Param("semKeywordReportBaiduEntityList") List<SemKeywordReportBaiduEntity> semKeywordReportBaiduEntityList);
}

然后再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.rrc.marketing.core.dao.sem.SemKeywordReportBaiduDao" >

    <insert id="duplicateInsertList" parameterType="java.util.List">
        INSERT INTO sem_keyword_report_baidu (
        fr, channel_id, channel_name,
        account_id, account_name, campaign_id,
        campaign_name,campaign_city,
        adgroup_id, adgroup_name,
        keyword_id,keyword,
        cost,cost_real,click,impression,
        device,report_level,report_type,
        the_day,the_week,the_month,
        version,create_date,update_date
        )VALUES
        <foreach collection="semKeywordReportBaiduEntityList" item="item" index="index" separator=",">
            (
            #{item.fr,jdbcType=VARCHAR}, #{item.channelId,jdbcType=INTEGER}, #{item.channelName,jdbcType=VARCHAR},
            #{item.accountId,jdbcType=BIGINT}, #{item.accountName,jdbcType=VARCHAR}, #{item.campaignId,jdbcType=BIGINT},
            #{item.campaignName,jdbcType=VARCHAR},#{item.campaignCity,jdbcType=VARCHAR},
            #{item.adgroupId,jdbcType=BIGINT}, #{item.adgroupName,jdbcType=VARCHAR},
            #{item.keywordId,jdbcType=BIGINT}, #{item.keyword,jdbcType=VARCHAR},
            #{item.cost,jdbcType=DECIMAL},#{item.costReal,jdbcType=DECIMAL},#{item.click,jdbcType=INTEGER},#{item.impression,jdbcType=INTEGER},
            #{item.device,jdbcType=VARCHAR},#{item.reportLevel,jdbcType=INTEGER},#{item.reportType,jdbcType=INTEGER},
            #{item.theDay,jdbcType=VARCHAR},#{item.theWeek,jdbcType=VARCHAR},#{item.theMonth,jdbcType=VARCHAR},
            #{item.version,jdbcType=INTEGER}, #{item.createDate,jdbcType=TIMESTAMP},#{item.updateDate,jdbcType=TIMESTAMP}
            )
        </foreach>
        ON DUPLICATE KEY UPDATE
        fr = VALUES(fr),channel_id = VALUES(channel_id),channel_name = VALUES(channel_name),
        account_id = VALUES(account_id),account_name = VALUES(account_name),campaign_id = VALUES(campaign_id),
        campaign_name = VALUES(campaign_name),campaign_city = VALUES(campaign_city),adgroup_id = VALUES(adgroup_id),adgroup_name = VALUES(adgroup_name),
        keyword = VALUES(keyword),cost = VALUES(cost),cost_real = VALUES(cost_real),
        click = VALUES(click),impression = VALUES(impression),device = VALUES(device),
        report_level = VALUES(report_level),report_type = VALUES(report_type),the_day = VALUES(the_day),
        the_week = VALUES(the_week),the_month = VALUES(the_month),version = VALUES(version),
        create_date = VALUES(create_date),update_date = VALUES(update_date)
    </insert>

</mapper>

感谢观看

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Mybatis可以通过使用批量插入的方式来提高数据插入的效率。具体步骤如下: 1. 在Mapper.xml文件中编写批量插入的SQL语句,例如: ``` <insert id="batchInsert" parameterType="java.util.List"> insert into user (name, age) values <foreach collection="list" item="item" separator=","> (#{item.name}, #{item.age}) </foreach> </insert> ``` 2. 在Java代码中调用Mapper接口的批量插入方法,例如: ``` List<User> userList = new ArrayList<>(); // 添加多个User对象到userList中 userMapper.batchInsert(userList); ``` 3. 在Mybatis的配置文件中开启批量插入的支持,例如: ``` <configuration> <settings> <setting name="jdbc.batch_size" value="100"/> </settings> </configuration> ``` 其中,jdbc.batch_size表示每次批量插入数据量,可以根据实际情况进行调整。 以上就是使用Mybatis批量插入数据MySQL的方法。 ### 回答2: Mybatis是一款优秀的ORM框架,通过Mybatis我们可以很方便地进行数据的CRUD操作。 在实际开发中,有我们需要批量插入数据MySQL数据库中,Mybatis也提供了非常方便的解决方案。 Mybatis批量插入数据MySQL的具体实现方式如下: 1. 创建一个DAO对象,用于与Mapper文件进行交互。 2. 在Mapper文件中定义一个批量插入数据的SQL语句,并使用foreach标签进行遍历。 3. 在DAO对象中调用mybatis提供的批量执行SQL语句的方法。 下面我们详细介绍一下这三个步骤的实现细节: 1. 创建一个DAO对象 创建DAO对象的过程和Mybatis普通操作数据库是相同的。在Spring框架中,我们可以通过注入SqlSession对象来操作数据库。具体如下: // 定义DAO对象 @Repository public class UserDaoImpl implements UserDao { // 注入SqlSession对象 @Autowired private SqlSession sqlSession; // 批量插入数据方法 public void batchInsert(List<User> userList) { // 调用Mapper文件中定义的SQL语句 sqlSession.insert("UserMapper.batchInsert", userList); } } 2. 定义批量插入SQL语句 在Mapper文件中定义一个批量插入的SQL语句,并使用foreach标签进行遍历。具体如下: <!-- 批量插入用户数据 --> <insert id="batchInsert" parameterType="java.util.List"> insert into user (username, age, gender) values <foreach collection="list" item="user" separator=","> (#{user.username}, #{user.age}, #{user.gender}) </foreach> </insert> 上述SQL语句中,我们使用了foreach标签进行遍历,并使用separator属性指定了每一条SQL语句之间的分隔符。 3. 调用批量执行SQL语句的方法 调用Mybatis提供的批量执行SQL语句的方法,具体如下: // 使用SqlSession批量执行SQL语句 sqlSession.flushStatements(); 注意,如果要进行批量操作,我们需要将所有SQL语句的执行结果全部缓存起来,然后一次性将缓存的数据提交至MySQL数据库中。上述代码中的flushStatements()方法就是将缓存的数据提交至MySQL数据库中。 通过以上三个步骤,我们就可以在Mybatis中完成数据批量插入操作了。此方法不仅提高了代码执行效率,而且减少了与MySQL之间的IO开销,从而有效的提高了系统的性能。 ### 回答3: Mybatis 是一款流行的 Java 持久化框架,它提供了一种简单的方式来访问和操作数据库。在大量数据插入的情况下,Mybatis批量插入功能能够显著提高插入性能。 在 Mybatis 中,批量插入数据MySQL 可以通过 SQL 批量执行来实现。以下是实现批量插入数据的步骤: 1. 创建一个数据源和一个 SqlSessionFactory 对象。数据源是连接数据库的关键。SqlSessionFactory 实例化后用来创建 SqlSession。 2. 创建一个 SqlSession 对象。SqlSession 是与数据库交互的主要对象。 3. 批量插入前,需要准备好要插入的数据。可以通过编写一个循环,或者使用工具类来读取数据源,把数据封装到一个对象列表中。 4. 在 Mybatis 的 Mapper XML 文件中,编写插入数据的 SQL 语句。通过使用 INSERT INTO VALUES 语法,可以实现批量插入数据。其中,VALUES 后面跟的是插入值的列表,每个列表代表一行。 5. 调用 SqlSession 的批处理方法,将插入 SQL 和数据列表传递给它。 6. 执行 SQL 批处理方法。Mybatis 会将 SQL 语句和参数封装到批处理对象中,并使用 JDBC 批量更新函数执行批量插入。 7. 最后,关闭 SqlSession 对象和数据库连接。 总之,Mybatis批量插入功能非常方便、高效,可以显著提高数据插入的性能。在实际项目中,我们可以根据具体需求选择合适的批处理方式,来实现高效的数据插入操作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值