mybatis、mybatisplus的常用操作
文章目录
- 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 插入/更新操作
①:更新操作
根据id更新
User user = new User(); user.setUserId(1); user.setAge(29); userMapper.updateById(user);
条件构造器作为参数进行更新,可以实现批量更新(所有
name = zhb
的数据都会被更新)//把名字为rhb的用户年龄更新为18,其他属性不变 UpdateWrapper<User> updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("name","zhb"); User user = new User(); user.setAge(18); userMapper.update(user, updateWrapper);
假设只更新一个字段在使用updateWrapper 的构造器中也需要构造一个实体对象,这样比较麻烦。可以使用updateWrapper的set方法,可以实现批量更新(所有
name = zhb
的数据都会被更新)//只更新一个属性,把名字为rhb的用户年龄更新为18,其他属性不变 UpdateWrapper<User> updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("name","zhb").set("age", 18); userMapper.update(null, updateWrapper);
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的常用操作相关推荐
- phoenix的元数据一般存在哪里_Phoenix常用操作
简介 Phoenix本意是凤凰的意思,Apache Phoenix是构建在HBase之上的关系型数据库层,作为内嵌的客户端JDBC驱动用以对HBase中的数据进行低延迟访问.Apache Phoeni ...
- mysql plus多表关联_结合mybatis-plus 实现实体操作多表关联查询
这里将告诉您结合mybatis-plus 实现实体操作多表关联查询,教程操作方法: multipleselect java mybatis 实现简单多表查询 简介 实现简单的实体类操作多表, 首先你的 ...
- idea项目相关错误与常用操作教程
目录 一.创建项目 1.主启动类main函数里面的String无法加载,因为没有导入JDK 2.破坏.idea缓存等导致的启动失败 3.创建web项目的包名应该是小写 二.SSMP实例 1.查询结果为 ...
- Mybatis框架实现CRUD操作
Mybatis框架实现CRUD操作 自定义mybatis流程 mybatis基于代理dao的CRUD操作(重点) E:\JAVAworkspace\mybatis_CRUD CRUD中可能遇到的问题: ...
- TensorFlow常用操作:代码示例
1,定义矩阵代码示例: import tensorflow as tftf.zeros([3,4]) #定义3行4列元素均为0的矩阵tensor=tf.constant([1,2,3,4])#定义一维 ...
- Ubuntu 常用操作
Ubuntu常用操作 外观操作 修改应用icon图标 终端美化 内存管理 内存查询 分区管理 日志清理 操作执行 自动执行多条命令 外观操作 修改应用icon图标 在/usr/share/applic ...
- IOS沙盒Files目录说明和常用操作
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...
- 用Python轻松搞定Excel中的20个常用操作
来源 |早起Python(ID: zaoqi-python) Excel与Python都是数据分析中常用的工具,本文将使用动态图(Excel)+代码(Python)的方式来演示这两种工具是如何实现数据 ...
- 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 ...
最新文章
- 亏损数亿,阿里也要强推99元白菜价智能音箱!背后逻辑到底是啥?
- TCP/IP协议——ARP详解
- Eclipse中将项目中build path底下的jar发布到tomcat下
- 了解关于Hadoop的12个事实
- Button的使用(五):从xml中加载
- 病毒c语言代码大全,谁有C语言编写的病毒源代码?
- java获取时间,本周,本月,本季度的起始
- 删除某文件以外的文件
- php 内存池,内存详解: 详解PHP内存池中的存储层_php
- 2021级研究生人工智能高级语言程序设计考试说明
- Python实战|「甜点消消」游戏数据分析过程
- Maven项目创建 Could not create local repository at 双重目录(F:/XX/F:/BB)怪异现象
- Deep Ordinal Regression Network for Monocular Depth Estimation
- 卸载过 IE浏览器,再安装提示“安装程序无法继续,因为你的计算机上安装了新的 Internet Explorer” ,cv 别人的IE浏览器安装文件夹打开 iexplore.exe 窗口闪一下又关掉了
- moba寻路_Dota2小技巧:从小兵仇恨到寻路机制
- 手机与电脑视频呼java_Android手机播放电脑视频文件-屌丝必备
- loadrunner中关联到的信息需要拼接时的例子-订飞机票
- 鸿蒙 林蒙 秦羽,从主神归来的主角们
- css+svg实现的定宽高比
- DS线性表—多项式相加