Mybatis自动生成常用问题

多字段查询问题

Mybatis 自动生成的代码不支持多字段的模糊查询,并且同时查询其他内容,
单个字段的模糊查询可以通过原有方法andXXXlike:Criteria.andNameLike(value);

1.查询结构

Select * from t_table where a=? and concat(‘’,’’,’’) like concat(‘’)
该查询语句中需要通过and连接 ,但是连接的内容为多个字段的模糊查询

2.添加结构

方式1

修改方法均为BeanCriteria方法中方法:
该方法利用自动生成工具生成的typeHandle属性,添加方法:

 /**
         * 多字段查询
         * @param condition
         * @param value1模糊查询,查询字段
         * @param value2
         * @param property
         */
        protected void addCriterion(String condition, Object value1, Object value2, String property,String typeHandle) {
            if (value1 == null || value2 == null) {
                throw new RuntimeException("Contact values for " + property + " cannot be null");
            }
            criteria.add(new Criterion(condition, value1, value2,typeHandle));
        }

修改构造函数,主要变更是添加typeHandler 的使用:

/**
         * 模糊查询
         * @param condition
         * @param value
         * @param secondValue
         * @param typeHandler contact仅支持多字段,不支持单字段
         */
        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
            super();
            this.condition = condition;
            this.value = value;
            this.secondValue = secondValue;
            this.typeHandler = typeHandler;
            if (null == typeHandler || "".equals(typeHandler)) {
                this.betweenValue = true;
            }else{//多字段模糊查询
                this.listValue = true;
            }

        }

添加模糊查询方法

       /**
         * 模糊查询Criteria 添加方法
         * @param columnIds
         * @param searchText
         * @return
         */
        public Criteria andConcatListLike(List<String> columnIds,String searchText) {
            // AND CONCAT(`VALUE_CODE`, `NAME`) LIKE CONCAT('%',#{searchParam},'%')
            addCriterion("Concat", columnIds,searchText, columnIds.toString(),"concat");
            return (Criteria) this;
        }

XML文件更改:<sql id="Example_Where_Clause">中部分修改

<when test="criterion.listValue">
                    <if test="criterion.typeHandler == 'concat'">
                         and CONCAT
                        <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
                            ${listItem}
                        </foreach>
                        LIKE  CONCAT('%',#{criterion.secondValue},'%')
                    </if>

                    <if test="criterion.typeHandler!='concat'">
                        and ${criterion.condition}
                        <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
                            #{listItem}
                        </foreach>
                    </if>
                </when>

方式2

and与or的联合使用

    BeanCriteria totalExample=new BeanCriteria();
    Criteria test = totalExample.createCriteria();
    test.andNameLike(text);
    Criteria ortest = totalExample.createCriteria();
    ortest.andIpLike(text);
    totalExample.or(ortest);

${}与#{}区别

注意事项:${}不会做特殊处理,#{}会将参数处理为字符串

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页