mybatis、mybatisplus的常用操作

本文详细介绍了MyBatis的批量插入、更新及删除操作,包括单条件与多条件批量删除的实现方式。同时,深入探讨了MyBatis-Plus的Lambda查询、分组查询、批量插入效率优化等高级特性,以及插入、更新操作的灵活应用。

1. mybatis-批量增加

<insert id="batchSaveUser">
        insert into t_user (user_name,sex) values
       /* 
        <!-- 动态SQL之foreach的用法 -->
        <!-- collection="users" 用于指定循环集合的名称,如果接口中并未指定参数别名,那么默认就是list
        */
         item="user" 用于指定每次循环后的对象的别名
         separator="," 用于指定每次循环后之间的分割符-->
        <foreach collection="users" item="user" separator=",">
            (#{user.userName},#{user.sex})
        </foreach>
</insert>

 

2. 单条件批量删除

方法1:括号()定义在for循环中

  <delete id="deleteBatch">
     delete from LP_SALARY_STANDARD
     where
     ID in
     <foreach collection="ids" item="id" separator="," open="(" close=")">
       #{id}
     </foreach>
  </delete>

方法2:括号()定义在for循环外

<delete id="batchDeleteUser">
        delete from t_user where id in
         (
	        <foreach collection="ids" item="id" separator=",">
	            #{id}
	        </foreach>
        )  
</delete>

mybatis-plus写法

    /**
     * 删除修理厂
     */
    @RequestMapping("/delete")
    public R delete(@RequestParam List<Integer> ids) {
        shxRepairFactorysService.removeByIds(ids);
        return R.ok();
    }

 

3. 多条件批量删除

mybatis写法①:and

//<!--通过条件删除数据   用or分割,可以带有index索引-->
    <delete id="batchDeleteByCondition">
        delete from test where
        <foreach collection="list" item="item" separator=" or " index="index">
            (name = #{item.name} and area_code = #{item.areaCode} and type = #{item.type})
        </foreach>
    </delete>

mybatis写法①:in

<delete id="deleteBatch" parameterType="java.util.List">
    delete from test
    where (PRSNLID, ENTID) in
    <foreach item="item" index="index" collection="list" separator="," open="(" close=")">
		(#{item.prsnlid},#{item.entid})
	</foreach>
</delete>

 

4. mp的lambda用法、分组查询

mybatis-plus常用操作点此查看!!

lambda查询

        List<CcUserEntity> list = ccUserService
        		.list(Wrappers.<CcUserEntity>lambdaQuery()
                .eq(CcUserEntity::getAccountType, ConstantEnum.AccountType.ASSESSMENT.getValue())
                .eq(CcUserEntity::getPersonBelongId, assessmentCompanyId));

分组查询:不使用lambda

 		QueryWrapper objectQueryWrapper = new QueryWrapper<>();

        objectQueryWrapper.select("case_status,count(*) num").groupBy("case_status");

        List list = ccTaskService.listMaps(objectQueryWrapper);
//  或者直接获取map
//      Map map = ccTaskService.getMap(objectQueryWrapper);

分组查询:使用lambda

        //遍历所有任务,并以公估公司id来分组
        Map<String, List<CcTaskEntity>> taskGroupByCompanyId = ccTaskService.list()
        .stream()
        .collect(Collectors.groupingBy(CcTaskEntity::getAssesmentCompanyId));

 

5. mybatis-plus 插入/更新操作

①:更新操作

  1. 根据id更新

    User user = new User();
    user.setUserId(1);
    user.setAge(29);
    userMapper.updateById(user);
    
  2. 条件构造器作为参数进行更新,可以实现批量更新(所有name = zhb 的数据都会被更新)

    //把名字为rhb的用户年龄更新为18,其他属性不变
    UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
    updateWrapper.eq("name","zhb");
    User user = new User();
    user.setAge(18);
    userMapper.update(user, updateWrapper);
    
  3. 假设只更新一个字段在使用updateWrapper 的构造器中也需要构造一个实体对象,这样比较麻烦。可以使用updateWrapper的set方法,可以实现批量更新(所有name = zhb 的数据都会被更新)

    //只更新一个属性,把名字为rhb的用户年龄更新为18,其他属性不变
    UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
    updateWrapper.eq("name","zhb").set("age", 18);
    userMapper.update(null, updateWrapper);
    
  4. lambda构造器,可以实现批量更新(所有name = zhb 的数据都会被更新)

    LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
    lambdaUpdateWrapper.eq(User::getName, "zhb").set(User::getAge, 18);
    Integer rows = userMapper.update(null, lambdaUpdateWrapper);
    

    或者

     LambdaUpdateWrapper<KfAppointmentDsEntity> wrapper = Wrappers.<KfAppointmentDsEntity>lambdaUpdate();
             wrapper.eq(KfAppointmentDsEntity::getAccidentno, "80052222222222222")
                    .eq(KfAppointmentDsEntity::getCarnum, "粤111111")
                    .set(KfAppointmentDsEntity::getTrueOrFalse, "真");
     kfAppointmentDsService.update(wrapper);
    

②:插入或更新:saveOrUpdate

saveOrUpdate不传Wrapper时,默认按照主键id进行更新或者插入

testtableService.saveOrUpdate(testtableEntity3);

在这里插入图片描述

saveOrUpdate带有Wrapper时,会更新所有符合Wrapper条件的数据!

testtableService.saveOrUpdate(testtableEntity3,
		Wrappers.<TesttableEntity>lambdaUpdate()
		.eq(TesttableEntity::getName,"BBB"));
  • 如果不存在符合Wrapper条件的,且实体类上无主键id,则直接执行插入!
    在这里插入图片描述

  • 如果不存在符合Wrapper条件的,其实体类上设置了主键id,则会通过主键id再差一次,决定更新还是插入!

    在这里插入图片描述
    在这里插入图片描述

③:(批量)新增或更新:saveOrUpdateBatch

该方法没有Wrapper条件

  testtableService.saveOrUpdateBatch(list );
  • 如果实体类设置了主键id,则根据id查询,决定更新或者插入
    在这里插入图片描述
  • 如果实体类采用主键自增,不手动设置主键id,则直接执行插入操作!
    在这里插入图片描述

 

6. mybatis-plus 中 and、or的用法

需求:查询 userId = 15 且 (status = 2 或者 fileSize = 3251544304L )的数据

or()的错误用法

LambdaQueryWrapper<Task> queryWrapper = new QueryWrapper<Task>().lambda();
 queryWrapper
  .eq(Task::getUserId, "15")
  .eq(Task::getStatus, 2)
  .or()
  .eq(Task::getFileSize, 3251544304L);

这种写法拼出来的SQL语句是这样的,显然查询结果是错误的

SELECT * FROM task WHERE user_id = ? AND status = ? OR file_size = ? 

 
or()的正确用法:配合and使用

LambdaQueryWrapper<Task> queryWrapper2 = new QueryWrapper<Task>().lambda();
 queryWrapper2
  .eq(Task::getUserId, "15")
  .and(wrapper -> wrapper.eq(Task::getStatus, 2).or().eq(Task::getFileSize, 3251544304L));

这种写法对应的sql如下,结果正确!

SELECT * FROM task WHERE user_id = ? AND ( status = ? OR file_size = ? )

 

7. mybatis-plus的批量插入效率对比,性能优化

mybatis-plus的批量插入效率对比
设置 rewriteBatchedStatements=true 开启jdbc批处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值