文章目录

  • 1. mybatis-批量增加
  • 2. 单条件批量删除
  • 3. 多条件批量删除
  • 4. mp的lambda用法、分组查询
  • 5. mybatis-plus 插入/更新操作
    • ①:更新操作
    • ②:插入或更新:saveOrUpdate
    • ③:(批量)新增或更新:saveOrUpdateBatch
  • 6. mybatis-plus 中 and、or的用法
  • 7. mybatis-plus的批量插入效率对比,性能优化

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_STANDARDwhereID 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 testwhere (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批处理

mybatis、mybatisplus的常用操作相关推荐

  1. phoenix的元数据一般存在哪里_Phoenix常用操作

    简介 Phoenix本意是凤凰的意思,Apache Phoenix是构建在HBase之上的关系型数据库层,作为内嵌的客户端JDBC驱动用以对HBase中的数据进行低延迟访问.Apache Phoeni ...

  2. mysql plus多表关联_结合mybatis-plus 实现实体操作多表关联查询

    这里将告诉您结合mybatis-plus 实现实体操作多表关联查询,教程操作方法: multipleselect java mybatis 实现简单多表查询 简介 实现简单的实体类操作多表, 首先你的 ...

  3. idea项目相关错误与常用操作教程

    目录 一.创建项目 1.主启动类main函数里面的String无法加载,因为没有导入JDK 2.破坏.idea缓存等导致的启动失败 3.创建web项目的包名应该是小写 二.SSMP实例 1.查询结果为 ...

  4. Mybatis框架实现CRUD操作

    Mybatis框架实现CRUD操作 自定义mybatis流程 mybatis基于代理dao的CRUD操作(重点) E:\JAVAworkspace\mybatis_CRUD CRUD中可能遇到的问题: ...

  5. TensorFlow常用操作:代码示例

    1,定义矩阵代码示例: import tensorflow as tftf.zeros([3,4]) #定义3行4列元素均为0的矩阵tensor=tf.constant([1,2,3,4])#定义一维 ...

  6. Ubuntu 常用操作

    Ubuntu常用操作 外观操作 修改应用icon图标 终端美化 内存管理 内存查询 分区管理 日志清理 操作执行 自动执行多条命令 外观操作 修改应用icon图标 在/usr/share/applic ...

  7. IOS沙盒Files目录说明和常用操作

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...

  8. 用Python轻松搞定Excel中的20个常用操作

    来源 |早起Python(ID: zaoqi-python) Excel与Python都是数据分析中常用的工具,本文将使用动态图(Excel)+代码(Python)的方式来演示这两种工具是如何实现数据 ...

  9. python和R对dataframe的常用操作的差异:head、tail、shape、dim、nrow、ncol、descirbe、summary、str

    python和R对dataframe的常用操作的差异:head.tail.shape.dim.nrow.ncol.descirbe.summary.str # python df.head() # R ...

最新文章

  1. 亏损数亿,阿里也要强推99元白菜价智能音箱!背后逻辑到底是啥?
  2. TCP/IP协议——ARP详解
  3. Eclipse中将项目中build path底下的jar发布到tomcat下
  4. 了解关于Hadoop的12个事实
  5. Button的使用(五):从xml中加载
  6. 病毒c语言代码大全,谁有C语言编写的病毒源代码?
  7. java获取时间,本周,本月,本季度的起始
  8. 删除某文件以外的文件
  9. php 内存池,内存详解: 详解PHP内存池中的存储层_php
  10. 2021级研究生人工智能高级语言程序设计考试说明
  11. Python实战|「甜点消消」游戏数据分析过程
  12. Maven项目创建 Could not create local repository at 双重目录(F:/XX/F:/BB)怪异现象
  13. Deep Ordinal Regression Network for Monocular Depth Estimation
  14. 卸载过 IE浏览器,再安装提示“安装程序无法继续,因为你的计算机上安装了新的 Internet Explorer” ,cv 别人的IE浏览器安装文件夹打开 iexplore.exe 窗口闪一下又关掉了
  15. moba寻路_Dota2小技巧:从小兵仇恨到寻路机制
  16. 手机与电脑视频呼java_Android手机播放电脑视频文件-屌丝必备
  17. loadrunner中关联到的信息需要拼接时的例子-订飞机票
  18. 鸿蒙 林蒙 秦羽,从主神归来的主角们
  19. css+svg实现的定宽高比
  20. DS线性表—多项式相加

热门文章

  1. 麦克风失灵_iPhone7Plus手机麦克风失灵怎么办?请看解决方案
  2. python没有上方工具栏_PyQt5快速上手基础篇8-菜单栏、工具栏和状态栏
  3. Linux必知必会的目录结构
  4. ambassador 学习七 Mapping说明
  5. vue练习之vue+cnode api
  6. 深入浅出 Java 8 Lambda 表达式
  7. oracle trunc()函数用法
  8. 爱上MVC~业务层刻意抛出异常,全局异常的捕获它并按格式返回
  9. chrony软件使用说明
  10. Tkinter编写Mac应用(-)