Mybatis的Mapper配置的高级特殊用法

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

一、做需求遇到的问题:

callOutSubTask中包括callOutTask的对象,当页面展示的时候没有输入,callOutSubTask为null,可以得到所有的callOutSubTask列表的数据,当输入日期,而不输入taskName是不能显示数据,原因出在Mapper.xml中。

类callOutTask

public class CallOutTask extends DataEntity<CallOutTask> {
    private Office office;
    private String taskName;
    private String taskDesc;
    private Integer taskSize;
    private Integer completedSize;
    // 0 已分配 1 已完成
    private Integer status;

    // 不入库,只是供存储字段使用
    private String seatList;        // 选取座席字段
    private String searchCondition; // 分配座席时客户的选择条件

    /* 用于查询,数据库没有字段 */
    private Date beginCreateDate;
    private Date endCreateDate;

    public Date getBeginCreateDate() {
        return beginCreateDate;
    }

    public void setBeginCreateDate(Date beginCreateDate) {
        this.beginCreateDate = beginCreateDate;
    }

    public Date getEndCreateDate() {
        return endCreateDate;
    }

    public void setEndCreateDate(Date endCreateDate) {
        this.endCreateDate = endCreateDate;
    }

    public String getTaskName() {
        return taskName;
    }

    public void setTaskName(String taskName) {
        this.taskName = taskName;
    }

    public String getTaskDesc() {
        return taskDesc;
    }

    public void setTaskDesc(String taskDesc) {
        this.taskDesc = taskDesc;
    }

    public Integer getTaskSize() {
        return taskSize;
    }

    public void setTaskSize(Integer taskSize) {
        this.taskSize = taskSize;
    }

    public Integer getCompletedSize() {
        return completedSize;
    }

    public void setCompletedSize(Integer completedSize) {
        this.completedSize = completedSize;
    }

    public String getSeatList() {
        return seatList;
    }

    public void setSeatList(String seatList) {
        this.seatList = seatList;
    }

    public String getSearchCondition() {
        return searchCondition;
    }

    public void setSearchCondition(String searchCondition) {
        this.searchCondition = searchCondition;
    }

    public Office getOffice() {
        return office;
    }

    public void setOffice(Office office) {
        this.office = office;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    /**
     * 判断taskName是否为空
     * @return
     */
    public Boolean isTaskNameNotNull(){
        return StringUtils.isNotEmpty(this.taskName);
    }
}

类callOutSubTask

public class CallOutSubTask extends DataEntity<CallOutSubTask> {
    private String taskId;
    private String executorId;
    private Integer subTaskNum;
    private Integer completedNum;
    private CallOutTask task;
    private User user;   //执行人关联对应id
    private Integer status;

    /* 用于查询,数据库没有字段 */
    private Date beginCreateDate;
    private Date endCreateDate;

    public Date getBeginCreateDate() {
        return beginCreateDate;
    }

    public void setBeginCreateDate(Date beginCreateDate) {
        this.beginCreateDate = beginCreateDate;
    }

    public Date getEndCreateDate() {
        return endCreateDate;
    }

    public void setEndCreateDate(Date endCreateDate) {
        this.endCreateDate = endCreateDate;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public CallOutTask getTask() {
        return task;
    }

    public void setTask(CallOutTask task) {
        this.task = task;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String getTaskId() {
        return taskId;
    }

    public void setTaskId(String taskId) {
        this.taskId = taskId;
    }

    public String getExecutorId() {
        return executorId;
    }

    public void setExecutorId(String executorId) {
        this.executorId = executorId;
    }

    public Integer getSubTaskNum() {
        return subTaskNum;
    }

    public void setSubTaskNum(Integer subTaskNum) {
        this.subTaskNum = subTaskNum;
    }

    public Integer getCompletedNum() {
        return completedNum;
    }

    public void setCompletedNum(Integer completedNum) {
        this.completedNum = completedNum;
    }

}

二、问题的解决:

1、在类CallOutSubTask中添加方法

  /**
     * 判断taskName是否为空
     * @return
     */
    public Boolean isTaskNameNotNull(){
        return StringUtils.isNotEmpty(this.taskName);
    }

2、配置mapper.xml

 <choose>
      <when test="task != null and task != ''">
          <if test="task.isTaskNameIsNull()">
              AND b.taskName= #{task.taskName}
          </if>
      </when>
  </choose>

这样满足了两种需求,以及配置中解决了不能出现task.taskNamel来进行判断

三、额外收获:

在xml当中对于日期的判断尽量不要用bettween来进行配置
会出现日期当中的数据查不出来的bug

再则,在配置xml当中会产生>与<不能书写的情况,这就需要其他方式了

 AND a.create_date &gt;= #{beginCreateDate}
 AND a.create_date &lt;= #{endCreateDate}

四、动态的,根据不同情况查询调用可以解决

五、动态传表和,连接表的数据

两个重要点:

1.用${tableName}而非#{tableName}
2.防止预编译 statementType=”STATEMENT”

 public List<MergeChannel> getMergeChannelList(@Param("tableName") String tableName,@Param("mode") Integer mode);
<select id="getMergeChannelList" resultType="MergeChannel" statementType="STATEMENT">
        <choose>
            <when test="mode==0">
                SELECT
                <include refid="mergeChannelSingleColumns"/>
                FROM `salecule`.${tableName} a
                <include refid="mergeChannelSingleChannelJoins"/>
            </when>
            <otherwise>
                SELECT
                <include refid="mergeChannelDoubleColumns"/>
                FROM  `salecule`.${tableName} b
                <include refid="mergeChannelDoubleChannelJoins"/>
            </otherwise>
        </choose>
</select>

猜你喜欢

转载自blog.csdn.net/qq_33624952/article/details/81867475
今日推荐