当前位置 博文首页 > 文章内容

    mybatis mapper互相引用resultMap启动出错的解决

    作者:shunshunshun18 栏目:未分类 时间:2021-08-25 14:43:27

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    mybatis mapper互相引用resultMap启动出错

    问题

    Caused by: java.lang.IllegalArgumentException: Result Maps collection does not contain value for kulink.cvscloud.core.mapper.OrderSundryMapper.BaseResultMap
    at org.apache.ibatis.session.Configuration$StrictMap.get(Configuration.java:888) ~[mybatis-3.4.5.jar:3.4.5]
    at org.apache.ibatis.session.Configuration.getResultMap(Configuration.java:640) ~[mybatis-3.4.5.jar:3.4.5]
    at org.apache.ibatis.builder.MapperBuilderAssistant.getStatementResultMaps(MapperBuilderAssistant.java:344) ~[mybatis-3.4.5.jar:3.4.5]

    ... 73 common frames omitted

    原因

    因为mybatis扫描加载的时候,是按顺序加载的A-Z,因为mapperA中引用mapperB中的ResultMap

    但是启动加载的时候mapperB加载在mapperA之后,所以造成mapperB.ResultMap找不到的问题。

    解决方法

    升级新版本,已经解决这个问题了

    或者在引用mapper.xml中把resultMap直接复制过来

    mybatis resultMap引发的吐血bug

    简单的讲

    问题背景:如果在写mybatis中的resultMap时,不下心将resultMapde id写成映射接口的名字,会发生什么?

    结论:单元测试进度条卡住但不报错, Tomcat运行不报错,但是不加载项目

    以下是详细的

    需求:从数据库中加载之前插入log日志,打印在某一页面上。

    如:

    在这里插入图片描述

    Java中的pojo:

    package pojo;
    import java.io.Serializable;
    import java.util.Date;
    /**
     * 系统日志
     *
     * @author Administrator
     */
    public class Log implements Serializable {
        private static final long serialVersionUID = -7372303516713218870L;
        private int id;//
        private int userId;//
        private String userName;
        private Date createDate;//创建日期
        private String content;//日志内容
        private String operation;//用户所做的操作
        private String url;//用户所做的操作
        public Log() {
        }
        public Log(int id, int userId, String userName, Date createDate, String content, String operation, String url) {
            this.id = id;
            this.userId = userId;
            this.userName = userName;
            this.createDate = createDate;
            this.content = content;
            this.operation = operation;
            this.url = url;
        }
        public static long getSerialVersionUID() {
            return serialVersionUID;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public int getUserId() {
            return userId;
        }
        public void setUserId(int userId) {
            this.userId = userId;
        }
        public String getUserName() {
            return userName;
        }
        public void setUserName(String userName) {
            this.userName = userName;
        }
        public Date getCreateDate() {
            return createDate;
        }
        public void setCreateDate(Date createDate) {
            this.createDate = createDate;
        }
        public String getContent() {
            return content;
        }
        public void setContent(String content) {
            this.content = content;
        }
        public String getOperation() {
            return operation;
        }
        public void setOperation(String operation) {
            this.operation = operation;
        }
        public String getUrl() {
            return url;
        }
        public void setUrl(String url) {
            this.url = url;
        }
        @Override
        public String toString() {
            return "Log{" +
                    "id=" + id +
                    ", userId=" + userId +
                    ", userName='" + userName + '\'' +
                    ", createDate=" + createDate +
                    ", content='" + content + '\'' +
                    ", operation='" + operation + '\'' +
                    ", url='" + url + '\'' +
                    '}';
        }
    }

    利用mybatis读取数据时,发生不可理解的事情

    在这里插入图片描述

    public List<Log> listAll();
        <resultMap id="LogMapper" type="Log">
            <id column="userid" property="userId"/>
            <result column="username" property="userName"/>
            <result column="content" property="content"/>
            <result column="operation" property="operation"/>
            <result column="createdate" property="createDate"/>
            <result column="url" property="url"/>
        </resultMap>
        <select id="listAll"   resultMap="LogMapper">
            SELECT * FROM t_log
        </select>

    程序一旦单元测试就会进入这样的状态,

    在这里插入图片描述

    无限循环,没有结束。不仅这个方法,所有的测试方法都进入这种“阻塞”的状态,关键还没有异常的提示(哭~)不仅如此,重启tomcat会进入这样

    在这里插入图片描述

    一方面tomcat不再加载项目,同时释放了几个看起来像是bug的坑,其实这些都时正常的信息,没有其他的东西!
    期间重新导过jar包,删除过tomcat,重新部署项目,但只有一添加上述代码,就会崩溃。最后发现,原来和接口名字重复了,重复了。。。。。

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持IIS7站长之家博文。