mybatis/mysql-高级insert

来源:互联网 发布:mac 查找文件夹路径 编辑:程序博客网 时间:2024/05/17 08:44
        好东西都是要拿出来分享的,最近在做的项目,有这样的需求        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)@SpringBootTestpublic 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
原创粉丝点击