mybatis/mysql-高级insert

        好东西都是要拿出来分享的,最近在做的项目,有这样的需求
        1.处理大量数据的插入(Replace into)
            分析:A: 数据量大  ——》尽量减少连接mysql的次数(非常耗时),一次性插入。
                 B:数据可能有重复 ——》如果你采用先查出数据库所有的数据,再重写hashcode和equal用set集合进行重复过滤,难免也有点太过复杂与耗时。





    //由于工作保密性质,所有的字段分析,我采用自定义的简单类型,说明问题即可。
    //采用Replace into  
    //会根据主键与索引判断是否重复,若有重复是删除旧数据,插入新数据
    //--------mybatis-------------
     <insert id="insertBatchByReplace" parameterType="java.util.List" >
            Replace into book (
            name,
            price ,
            pic,
            description
            )VALUES
            <foreach collection="list" item="book"  separator="," >
            (#{book.name},
            #{book.price},
            #{book.pic},
            #{book.description}
            )
            </foreach>
        </insert>
   //---------------mapper----------
         @Mapper
        public interface BookMapper {

            List<Book> findAll();

            int insertBatchByReplace(List<Book> list);
        }

    //---------------test---------------
    @RunWith(SpringRunner.class)
@SpringBootTest
public class BookMapperTest {

    @Autowired
    private BookMapper bookMapper;

    @Test
    public void testInsertBatchByReplace() {
        //mybatis多数据源博客有详细解释(报错:Table 'mybatis.book' doesn't exist)
        DynamicDataSource.setDatabaseType(DataSourceType.lucene);  //此行代码与下面无关
        ArrayList<Book> list = Lists.newArrayList();
        int count = 1 ;
        while (count <= 10) {
            Book book = new Book();
            book.setName("testName " + count ); //设置name为索引,会以name为判断
            book.setPrice(0.0 + count );
            book.setPic("testPic " + count  );
            book.setDescription("testDescription " + count );
            count ++;
            list.add(book);
            if (count % 2 == 0) {
                list.add(book); //重复数据
            }
        }
        int i=bookMapper.insertBatchByReplace(list);
        Assert.assertTrue( i > 0 );
    }
}
2.插入定时处理后发生溢流路段的speed结果(ON DUPLICATE KEY UPDATE ) 分析:发生溢流的路段数据量可能小,但是可能是insert可能是update, 你需要的只是该对象中的speed 字段与updateTime字段的变化 ——》如果采用根据主键 和索引 采用update语句,难免也要使用for循环
//ON DUPLICATE KEY UPDATE 如果有主键或者索引重复 则会修改相应的字段
// ---------------------mybatis---------------------- 
   <insert id="insertWithUpdate" parameterType="com.mybatis.datasources.dataobject.Book">
            insert into book (
            name,
            price ,
            pic,
            description
            )  VALUES  (
            #{name},
            #{price},
            #{pic},
            #{description}
            )
            ON DUPLICATE KEY UPDATE
            pic= #{pic},
            description = #{description}
        </insert>
//------------------mapper-------------------------
 int insertWithUpdate(Book book);



 @Test
    public void testInsertWithUpdate() {
        //mybatis多数据源博客有详细解释(报错:Table 'mybatis.book' doesn't exist)
        DynamicDataSource.setDatabaseType(DataSourceType.lucene);  //此行代码与下面无关
        ArrayList<Book> list = Lists.newArrayList();
        int count = 1 ;
        while (count <= 10) {
            Book book = new Book();
            book.setName("testName " + count );  //设置name为索引,这点真的很重要!!!!!!!
            book.setPrice(0.0 + count );
            book.setPic("testPic " + count + count);
            book.setDescription("testDescription " + count + count );
            count ++;
            int i=bookMapper.insertWithUpdate(book);
            Assert.assertTrue( i > 0 );
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值