mybatis中parameterType 对象传值字段匹配问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/afsvsv/article/details/85272585

众所周知,parametertype传入参数分为以下两种:

(1)java基本数据类型

(2)复杂数据类型(java实体类和Map,List) 

本文的重点讨论的分页查询中是java实体类的字段匹配问题

分页的通用实体类如下:

public abstract class BaseQuery {
    private Integer page=1;         // 当前页
    private Integer rows=10;        // 每页显示条数
    
    private Date startDate;         // 开始日期
    private Date endDate;           // 结束日期
    
    /**
     * limit开始数
     * @return
     */
    public Integer getStartSize() {
        return (page - 1) * rows;
    }
    
    public Integer getPage() {
        return page;
    }

    public void setPage(Integer page) {
        this.page = page;
    }

    public Integer getRows() {
        return rows;
    }

    public void setRows(Integer rows) {
        this.rows = rows;
    }

    
    public Date getStartDate() {
        return startDate;
    }

    public Date getEndDate() {
        return endDate;
    }

    public void setStartDateStr(String startDateStr) {
        if (StringUtils.isNotBlank(startDateStr)) {
            this.startDate = DateUtils.INSTANCE.getDate(startDateStr, DateUtils.DATE_FROMAT);
        } else {
            this.startDate = null;
        }
    }

    @SuppressWarnings("all")
    public void setEndDateStr(String endDateStr) {
        if (StringUtils.isNotBlank(endDateStr)) {
            Date date = DateUtils.INSTANCE.getDate(endDateStr, DateUtils.DATE_FROMAT);
            if (date != null) {
                date.setDate(date.getDate() + 1);
            }
            this.endDate = date;
        } else {
            this.endDate = null;
        }
    }

    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
    }
}

Mapper.xml中的分页sql如下:

<select id="querySubList" parameterType="UserQuery" resultMap="resultDMap">
		SELECT id,phone,status,email,address,distributor_name,distributor_code,create_time,modify_time
			FROM 
				ts_user
			<include refid="queryConditionSql"/>
			and shop_id is not null
			ORDER BY 
				create_time 
			LIMIT 
				#{startSize},#{rows}
			
</select>

其中,需要传入的分页参数是 startSize 和  rows

但是在实体类中,没有startSize这个属性字段,只有getStartSize()这个get方法,为什么能取到值去匹配呢?

先猜测,是不是拿的get方法取值的呢?当然后续要去验证

Mybatis的Mapper.java文件没有对应的实现类,具体是有Mybatis自己根据Mapper.xml和Mapper.java的对应关系做的代理是实现的,于是跟踪代码如下:

MapperProxy  带有后缀Proxy的我就不说了,都知道是代理类了,用反射去调用代理类中的invoke方法

MapperMethod   进去具体的Mapper中的method方法区组装stmt 和 sql

具体组装sql,生成 stmt的我就不贴图了啊,查看stmt中的内容如下:

HikariProxyPreparedStatement@419310870 wrapping com.mysql.cj.jdbc.ClientPreparedStatement: 
select id,msg_from,msg_to,type,msg_info,msg_content,create_time
	     from ts_push
	     where msg_to=** NOT SPECIFIED **
	      
	     order by create_time desc
	     limit ** NOT SPECIFIED **,** NOT SPECIFIED **
		 

下面就该字段匹配去填充stmt中的字段了,继续跟踪如下:

果然是 根据字段 去找 getMethods中找,getMethods是个HashMap,存放的是获取的实体类的反射对象的所有的get方法

因此又去查看getMethods初始化的代码,如下所示:

可以看出,在用反射获取分页实体类的时候,是拿了全部的内容,如上图所示。

至此为止,mybatis中parameterType 对象传值字段匹配问题终于有了清晰地认识和了理解

总结:刚开始,自己不明白,准备直接开口请教别人呢,但是做一个程序猿,还是要沉下心来自己钻研 一下源码,这样才能理解的更深刻。当然,实在不行,再请教大神。

猜你喜欢

转载自blog.csdn.net/afsvsv/article/details/85272585