众所周知,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如下:
其中,需要传入的分页参数是 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 对象传值字段匹配问题终于有了清晰地认识和了理解
总结:刚开始,自己不明白,准备直接开口请教别人呢,但是做一个程序猿,还是要沉下心来自己钻研 一下源码,这样才能理解的更深刻。当然,实在不行,再请教大神。