mybatis批量新增、删除、查询和修改方式
目录
- 前期说明:
- 主要有一下3种情况:
- (1)mybatis批量新增
- (2)mybatis批量删除
- (3)mybatis批量查询
- (4)mybatis批量修改
- mySql Case函数
- 动态批量修改:DeviceMapper.xml
- 动态批量修改:DeviceMapper.java
- 控制层(xxxxController)
前期说明: foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有 item,index,collection,open,separator,close。
item表示集合中每一个元素进行迭代时的别名,index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的
主要有一下3种情况:
1.如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
2.如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
3.如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在breast里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key
(1)mybatis批量新增 mapper.xml
insert intoel_user_info (id,user_name,user_tel,pass_word,user_sex,del_mark,position_id,agency_id,create_date,update_date,role_id,employee_id,org_id)values (#{item.id},#{item.userName},#{item.userTel}, #{item.passWord},#{item.userSex},#{item.delMark},#{item.positionId},#{item.agencyId},#{item.createDate},#{item.updateDate},#{item.roleId},#{item.employeeId},#{item.orgId})
mapper:
/*** 批量插入** @param list* @return*/int createBatchUserInfoList(Listlist); serviceImpl实现类:try {List userList = new ArrayList (); if (CollectionUtils.isNotEmpty(list)) {//组织idLong orgId = elAppInfoService.getOrg().getOrgId(); for (int i = 0; i < list.size(); i++) {Map map = list.get(i); String userSex = map.get("userSex").toString().trim(); String userName = map.get("userName").toString().trim(); String userTel = map.get("userTel").toString().trim(); String key = userName + userTel; String redisCacheByKey = redisCacheService.getRedisCacheByKey(key); log.info(redisCacheByKey); if (!StringUtils.isEmpty(redisCacheByKey)) {//redisCacheService.deleteRedisCacheByKey(key); continue; }if ("男".equals(userSex)) {userSex = "0"; } else if ("女".equals(userSex)){userSex = "1"; }ElUserInfo user = new ElUserInfo(); user.setUserName(userName); user.setUserTel(userTel); user.setPassWord(MD5(map.get("passWord").toString().trim())); user.setUserSex(userSex); user.setPositionId(postionId); user.setAgencyId(agencyId); user.setCreateDate(new Date()); user.setUpdateDate(new Date()); user.setDelMark(0); user.setRoleId(1L); user.setEmployeeId(0L); user.setOrgId(orgId); userList.add(user); }if (CollectionUtils.isNotEmpty(userList)) {//先持久化本地row = userInfoMapper.createBatchUserInfoList(userList); if (row > 0) {//持久化成功后同步组织平台String add = orgEmployeeService.addOrganRoleUserToPlatform(userList, "add"); if (!StringUtils.isEmpty(add) && !"-1".equals(add) && !"null".equals(add)) {//以用户手机号码为唯一标示,批量修改OrgId和EmployeeIduserInfoMapper.updateBatchOrgId(userList); }log.info(this.getClass().getName()+"的UserInfoThread"+add.toString()); }}}} catch (Exception e) {log.error("elPositionInfoServiceImpl的UserInfoThread方法error"+e.getMessage(),e); }
(2)mybatis批量删除 mapper.xml:
delete from t_user where id in ( #{id} )delete from t_user where id in #{id}
mapper:
int batchDeleteUser(int[] ids);
(3)mybatis批量查询 mapper.xml:
selectfrom el_position_infowhere roleCode in #{item.roleCode}
mapper:
ListgetPostionListIdsByRoleCode(List list);
(4)mybatis批量修改 mybatis批量修改 (update的值也是动态的)
最近公司有个业务:统计设备app的在线状态,写了个心跳,每分钟获取app的状态,主要是分为:
(1)内网在线
(2)外网在线
(3)第三方网络
(4)离线
放在集合里,然后我在批量修改每个设备的onlineState的标识状态。这就要动态的批量修改onlineState中的值,但是mybatis并不支持 set onlineState = ? 的修改(onlineState是动态的)。然后通过查阅相关资料,通过mysql的case when then 来实现的。具体的实现如下:
mySql Case函数
SELECTSUM(population), CASE country WHEN '中国'THEN '亚洲' WHEN '印度'THEN '亚洲' WHEN '日本'THEN '亚洲' WHEN '美国'THEN '北美洲' WHEN '加拿大'THEN '北美洲' WHEN '墨西哥'THEN '北美洲' ELSE '其他' END FROMTable_A
动态批量修改:DeviceMapper.xml
update t_device set online_state = case device_no WHEN #{item.deviceNo} THEN #{item.onlineState} END where device_no in#{device.deviceNo}
动态批量修改:DeviceMapper.java
int updateBatchOnlineState(Listlist);
控制层(xxxxController)
//在线设备编号前端300秒调用一次 ,服务端640秒认为过期List deviceNos = DeviceCache.getDeviceNo(640); Listlist = new ArrayList (); if (CollectionUtils.isNotEmpty(deviceNos)) {for (String str : deviceNos) {Device device = new Device(); int indexOf = str.lastIndexOf("-"); String deviceNo = str.substring(0, indexOf); String type = str.substring(indexOf+1, str.length()); device.setDeviceNo(deviceNo); device.setOnlineState(Integer.valueOf(type)); list.add(device); }int row = deviceService.updateBatchOnlineState(list); if (row < 1) {logger.debug("批量修改失败!"); } else {logger.debug("批量修改成功,已实时获取设备在线状态!"); }} else {logger.debug("目前没有设备在线!"); deviceService.modifyAllNotOnline(); }
【mybatis批量新增、删除、查询和修改方式】以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- mybatisplus如何在xml的连表查询中使用queryWrapper
- mybatisplus|mybatisplus where QueryWrapper加括号嵌套查询方式
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- Excel|Excel 2013 新增功能之瞬间填充整列数据!
- MyBatis|MyBatis Generator配置
- 12.新增腾讯的统计(以渠道来源说明)
- HTML5新增选择器属性方法
- Mybatis|Mybatis Plus 分页插件