mybatis批量新增、删除、查询和修改方式

网友投稿 925 2022-12-04

mybatis批量新增、删除、查询和修改方式

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 into

el_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(List list);

serviceImpl实现类:

try {

List userList = new ArrayList();

if (CollectionUtils.isNotEmpty(list)) {

//组织id

Long orgId = elAppInfoService.getOrg().getOrgId();

for (int i = 0; i < list.size(); i++) {

Map map = list.get(i);

http:// 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和EmployeeId

userInfoMapper.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:

select

from el_position_info

where roleCode in

#{item.roleCode}

mapper:

List getPostionListIdsByRoleCode(List list);

(4)mybatis批量修改

mybatis批量修改 (update的值也是动态的)

最近公司有个业务:统计设备app的在线状态,写了个心跳,每分钟获取app的状态,主要是分为:

(1)内网在线

(2)外网在线

(3)第三方网络

(4)离线

放在集合里,然后我在批量修改每个设备的onlineState的标识状态。这就要动态的批量修改onlineState中的值,但是mybatis并不支持 set onlineState = ? 的修改(onlineState是动态的)。然后通过查阅相关资料,通过mysql的case when then 来实现的。具体的实现如下:

mySql Case函数

SELECT SUM(population),

CASE country

WHEN '中国' THEN '亚洲'

WHEN '印度' THEN '亚洲'

WHEN '日本' THEN '亚洲'

WHEN '美国' THEN '北美洲'

WHEN '加拿大' THEN '北美洲'

WHEN '墨西哥' THEN '北美洲'

ELSE '其他' END

FROM Table_A

动态批量修改:DeviVhioYFMyeceMapper.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(List list);

控制层(xxxxController)

//在线设备编号 前端300秒调用一次 ,服务端640秒认为过期

List deviceNos = DeviceCache.getDeviceNo(640);

List list = 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();

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:MybatisPlus实现分页查询和动态SQL查询的示例代码
下一篇:基于mybatis中数组传递注意事项
相关文章

 发表评论

暂时没有评论,来抢沙发吧~