最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis的五種批量查詢實例總結(jié)

 更新時間:2023年02月28日 10:00:46   作者:誰是黃黃  
為了提高代碼的執(zhí)行效率,我們有時需要采用批量查詢的查詢方法,下面這篇文章主要給大家介紹了關(guān)于MyBatis的五種批量查詢的相關(guān)資料,需要的朋友可以參考下

一.直接循環(huán)插入

@RestController
@RequestMapping("/mybatis3/user")
@RequiredArgsConstructor
public class UserController {

    private final IUserService iUserService;

    @GetMapping("/one")
    public Long one(){
       return iUserService.add();
    }
}

  Long add();

@Service
@RequiredArgsConstructor
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {

    private final UserMapper userMapper;

    @Override
    public Long add() {

        long start = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            User user = new User();
            user.setUsername("name"+i);
            user.setPassword("password"+i);
            userMapper.insertUsers(user);
        }
        long end = System.currentTimeMillis();
        System.out.println("耗時:"+( end - start ) + "ms");
        return (end-start);
    }
    }

 Integer insertUsers(User user);

 <insert id="insertUsers" >
        insert into user(username,password)
        values (#{username}, #{password})
    </insert>

最終耗時:14s多

二.關(guān)閉MySql自動提交,手動進行循環(huán)插入提交

@RestController
@RequestMapping("/mybatis3/user")
@RequiredArgsConstructor
public class UserController {

    private final IUserService iUserService;

        @GetMapping("/one")
    public Long one(){
       return iUserService.add();
    }
}

 Long add2();

@Service
@RequiredArgsConstructor
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {

    private final UserMapper userMapper;

//    手動開啟sql的批量提交
    private final   SqlSessionTemplate sqlSessionTemplate;

    @Override
    public Long add2(){
        //關(guān)閉自動提交
        SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        long start = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            User user = new User();
            user.setUsername("name"+i);
            user.setPassword("password"+i);
            mapper.insertUsers(user);
        }
        //自動提交SQL
        sqlSession.commit();
        long end = System.currentTimeMillis();
        System.out.println("耗時:"+( end - start ) + "ms");
        return (end-start);
    }
    }

平均:0.12s

第三種:用List集合的方式插入數(shù)據(jù)庫(推薦)

@RestController
@RequestMapping("/mybatis3/user")
@RequiredArgsConstructor
public class UserController {

    private final IUserService iUserService;

       @GetMapping("/one3")
    public Long one3(){
        return iUserService.add3();
    }
}

  Long add3();

@Service
@RequiredArgsConstructor
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {

    private final UserMapper userMapper;

  @Override
    public Long add3(){
        long start = System.currentTimeMillis();
        List<User> userList = new ArrayList<>();
        User user;
        for (int i = 0; i < 10000; i++) {
            user = new User();
            user.setUsername("name"+i);
            user.setPassword("password"+i);
            userList.add(user);
        }
        userMapper.insertUsersThree(userList);
        long end = System.currentTimeMillis();
        System.out.println("耗時:"+( end - start ) + "ms");
        return (end-start);
    }
    }

 Integer insertUsersThree(List<User> userList);

<insert id="insertUsersThree">
        insert into user(username,password)
        values
        <foreach collection="userList" item="user" separator=",">
            (#{user.username},#{user.password})
        </foreach>
    </insert>

第四種: MyBatis-Plus提供的SaveBatch方法

@RestController
@RequestMapping("/mybatis3/user")
@RequiredArgsConstructor
public class UserController {

    private final IUserService iUserService;

@GetMapping("/one4")
    public Long one4(){
        return iUserService.add4();
    }
}

  Long add4();

@Service
@RequiredArgsConstructor
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {

    private final UserMapper userMapper;

@Override
    public Long add4() {
        long start = System.currentTimeMillis();

        List<User> userList= new ArrayList<>();
        User user ;
        for (int i = 0; i < 10000; i++) {
            user = new User();
            user.setUsername("name"+i);
            user.setPassword("password"+i);
            userList.add(user);
        }

        saveBatch(userList);
        long end = System.currentTimeMillis();
        System.out.println("耗時:"+( end - start ) + "ms");
        return (end-start);
    }
    }

直接報錯:

看報錯信息:

長串:Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: com.huang.mybatis3.mapper.UserMapper.insert (batch index #1) failed. Cause: java.sql.BatchUpdateException: Data truncation: Out of range value for column ‘id’ at row 1
; Data truncation: Out of range value for column ‘id’ at row 1; nested exception is java.sql.BatchUpdateException: Data truncation: Out of range value for column ‘id’ at row 1] with root cause

短串:Data truncation: Out of range value for column ‘id’ at row 1

翻譯一下:

可以發(fā)現(xiàn)就是我們的id超出范圍:

int類型改為bigint即可

故此我們可以得出一個結(jié)論:設(shè)置數(shù)據(jù)庫id的時候設(shè)置為bigint還是蠻好的哈

平均時間:0.2s

第五種 MyBatis-Plus提供的InsertBatchSomeColumn方法(推薦)

InsertBatchSomeColumn方法了解

這個類的注解就寫的很明白

擴展這個InsertBatchSomeColumn方法

@Slf4j
public class EasySqlInjector extends DefaultSqlInjector {

    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {
        // 注意:此SQL注入器繼承了DefaultSqlInjector(默認(rèn)注入器),調(diào)用了DefaultSqlInjector的getMethodList方法,保留了mybatis-plus的自帶方法
        List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);
        methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));
        log.info("擴展的getMethodList方法被框架調(diào)用了");
        return methodList;
    }
}

擴展的方法注入bean容器

/**
 * @author Stone
 * @date 2023/1/3
 * @apiNote
 */
@Configuration
public class MybatisPlusConfig {
    @Bean
    public  EasySqlInjector sqlInjector(){
        return new EasySqlInjector();
    }
}

創(chuàng)建一個Mapper去實現(xiàn)我們的擴展的飛方法

public interface EasySqlInjectMapper<T> extends BaseMapper<T> {
    /**
     * 批量插入 僅適用于mysql
     *
     * @param entityList 實體列表
     * @return 影響行數(shù)
     */
    Integer insertBatchSomeColumn(Collection<T> entityList);
}

業(yè)務(wù)層

@Override
    public Long add5() {
        long start = System.currentTimeMillis();

        List<User> userList= new ArrayList<>();
        User user ;
        for (int i = 0; i < 10000; i++) {
            user = new User();
            user.setUsername("name"+i);
            user.setPassword("password"+i);
            userList.add(user);
        }

        userMapper.insertBatchSomeColumn(userList);
        long end = System.currentTimeMillis();
        System.out.println("耗時:"+( end - start ) + "ms");
        return (end-start);
    }

耗時: 0.2 s

總結(jié) 

到此這篇關(guān)于MyBatis的五種批量查詢的文章就介紹到這了,更多相關(guān)MyBatis批量查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot+阿里云OSS實現(xiàn)在線視頻播放的示例

    SpringBoot+阿里云OSS實現(xiàn)在線視頻播放的示例

    這篇文章主要介紹了SpringBoot+阿里云OSS實現(xiàn)在線視頻播放的示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • springboot配置logback日志管理過程詳解

    springboot配置logback日志管理過程詳解

    這篇文章主要介紹了springboot配置logback日志管理過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • java 單例模式容易忽略的細節(jié)

    java 單例模式容易忽略的細節(jié)

    這篇文章主要介紹了java 單例模式容易忽略的細節(jié),幫助大家更好的理解和使用java 單例模式,感興趣的朋友可以了解下
    2020-12-12
  • Java中PageHelper分頁后對list操作導(dǎo)致分頁無效

    Java中PageHelper分頁后對list操作導(dǎo)致分頁無效

    在項目中使用分頁插件的時候發(fā)現(xiàn)PageHelper插件失效了,本文就來介紹一下Java中PageHelper分頁后對list操作導(dǎo)致分頁無效的解決方法,感興趣的可以了解一下
    2021-05-05
  • Java基礎(chǔ)之反射詳解

    Java基礎(chǔ)之反射詳解

    這篇文章主要介紹了教你怎么通過IDEA設(shè)置堆內(nèi)存空間,文中有非常詳細的代碼示例,對正在使用IDEA的小伙伴們很有幫助喲,需要的朋友可以參考下
    2021-05-05
  • java中ThreadLocal的基本原理

    java中ThreadLocal的基本原理

    本文講解了java中ThreadLocal的一些基本原理,文中關(guān)于ThreadLocal的原理講解的非常詳細,感興趣的朋友一起看看吧
    2021-08-08
  • Springboot 全局時間格式化三種方式示例詳解

    Springboot 全局時間格式化三種方式示例詳解

    時間格式化在項目中使用頻率是非常高的,當(dāng)我們的 API? 接口返回結(jié)果,需要對其中某一個 date? 字段屬性進行特殊的格式化處理,通常會用到 SimpleDateFormat? 工具處理,這篇文章主要介紹了3 種 Springboot 全局時間格式化方式,需要的朋友可以參考下
    2024-01-01
  • Spring復(fù)雜對象創(chuàng)建的方式小結(jié)

    Spring復(fù)雜對象創(chuàng)建的方式小結(jié)

    這篇文章主要介紹了Spring復(fù)雜對象創(chuàng)建的三種方式,現(xiàn)在使用Spring如何創(chuàng)建這種類型的對象?Spring中提供了三種方法來創(chuàng)建復(fù)雜對象,需要的朋友可以參考下
    2022-01-01
  • 一文帶你搞懂什么是BIO

    一文帶你搞懂什么是BIO

    BIO英文全名是 blocking IO,也叫做 阻塞IO,是最容易理解、最容易實現(xiàn)的IO工作方式,本文就來通過一些簡單的示例為大家講講什么是BIO吧
    2023-06-06
  • Spring Cloud 系列之服務(wù)調(diào)用 OpenFeign的實現(xiàn)

    Spring Cloud 系列之服務(wù)調(diào)用 OpenFeign的實現(xiàn)

    這篇文章主要介紹了Spring Cloud 系列之服務(wù)調(diào)用 OpenFeign的實現(xiàn),需要的朋友可以參考下
    2020-11-11

最新評論

比如县| 池州市| 肇东市| 清原| 那坡县| 祥云县| 莱西市| 水城县| 房产| 阿坝| 顺昌县| 余干县| 广东省| 自贡市| 桂阳县| 东安县| 中牟县| 浪卡子县| 阜康市| 南和县| 三门县| 巨鹿县| 南溪县| 莆田市| 吴忠市| 千阳县| 丹阳市| 陕西省| 乐清市| 北海市| 铜川市| 酉阳| 庆城县| 雷波县| 通道| 江西省| 萨迦县| 施秉县| 邯郸县| 鸡西市| 荔浦县|