MyBatis 实现消息页面,批量查询用户信息

来源:互联网 发布:app软件测试工程师 编辑:程序博客网 时间:2024/06/04 18:17

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/50699141 未经博主允许不得转载。
博主地址是:http://blog.csdn.net/freewebsys

1,背景

开发了java这么久,有的时候会偷懒写一些代码,影响性能。
比如 消息列表里面,查询用户信息。
这样就会造成一个N+1的问题,有多少条消息就查询了多少次用户信息。
hibernate 里面有个很不错的功能 left outer join fetch。可以解决N+1的问题,但是现在已经没有人用hibernate了,用mybatis的人比较多,所以得手动写代码进行查询优化了。

开始写代码想着完成功能,在后来就要考虑优化,使用高效的查询方式,这样的才能提高用户体验。

2,MyBatis批量查询

比如数据表为:

    <select id="selectByIdBatch" parameterType="java.util.List" resultMap="userInfo">        SELECT            id,name,sex,phone        FROM            user_info        <where>            id in            <foreach item="id" collection="list" separator="," open="(" close=")" index="">                #{id, jdbcType=NUMERIC}            </foreach>        </where>    </select>

然后使用在循环里面,找到多个id,然后用in查询将user_info数据查询出来,在放到msg的对象里面。

比如两个类public class Message{    private Long id;    private String content;    private Date createTime;    private Long uid;    priavte UserInfo userInfo;}public class UserInfo{    private Long id;    private String name;    private String phone;}
//示意代码:用作代码展示,没有编译过。List<Message> msgList = msgMapper.selectPage(0,10);//示意Set存储,保证Id不重复。Set<Long> msgIds = new HashSet<Long>();//循环Message消息,找到所有Id。for(Message msg:msgList){    if(msg != null && msg.getId() != null){        msgIds.add(msg.getId());    }}//批量查询用户信息。List<UserInfo> userList = userMapper.selectByIdBatch(new ArrayList<Long>(msgIds));//将用户List转换成MapMap<Long,List<UserInfo>> userMap = new HashMap<Long,List<UserInfo>>();for(UserInfo userInfo:userList){    if(userInfo != null && userInfo.getId() != null){        //转换map。        userMap.add(userInfo.getId(),userInfo);    }}//循环消息再把UserInfo对象放回去。for(Message msg : msgList){    if(msg != null && msg.getUid() != null){        UserInfo userInfo = userMap.get(msg.getUid());        //设置用户        msg.setUserInfo(userInfo);    }}//最后再显示。.....

3,总结

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/50699141 未经博主允许不得转载。
博主地址是:http://blog.csdn.net/freewebsys

虽然代码写的比较多,但是性能得到了提供,查询数据库的次数减少了。
优化了查询效率,提高了用户体验,减少了用户等待时间。
这里有个小技巧,mybatis不支持Set,只能用List。Set保持id不重复。
使用new ArrayList(msgIds) 可以将Set转换成List。
查询完成之后放到Map数组里面,减少循环次数。
这样就完成优化了,效率得到了提高。

2 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 买二手苹果手机没有账号怎么办 手机淘宝足迹不更新怎么办 淘宝申请退款不想退了怎么办 荣耀3c主板坏了怎么办 荣耀10天气删了怎么办 荣耀7i手机卡顿怎么办 荣耀v9总是自己拨号怎么办 华为荣耀5x很卡怎么办 华为荣耀6plus卡怎么办 华为手机触屏不灵敏怎么办 华为荣耀6x太卡怎么办 华为荣耀7太卡怎么办 荣耀手机开不开机怎么办 华为g750手机开不了机怎么办 华为手机开不了机怎么办 小米手机刷机后激活不了帐号怎么办 魅蓝note5卡顿怎么办 魅蓝note5卡了怎么办 魅蓝note5很卡怎么办 魅蓝note5锁了怎么办 荣耀9开不开机怎么办 4s更新后用不了怎么办 魅蓝3开不了机怎么办 手机不支持联通4g网络怎么办 华为手机出现emui界面怎么办 华为畅玩4x内存不足怎么办 手机电源键掉了怎么办 手机电源键坏了怎么办 小米5s听筒声音小怎么办 荣耀8电源键失灵怎么办 华为荣耀3c卡怎么办 大王卡是2g网络怎么办 联通停用2g副卡怎么办 华为荣耀8忘记解锁密码怎么办 华为手机内存满了怎么办 华为手机无限重启怎么办 华为3c重启怎么办 荣耀6 无限重启怎么办 手机进水无法开机了怎么办 华为手机不停重启怎么办 华为手机反复重启怎么办