擴展 mybatis generator 的 or 條件操作

mybatis generator自動生成的查詢代碼不支持and和or混合查詢,參考了一個大神的文章,結合自身情況擴展了or條件語句

參考 : https://www.cnblogs.com/kangping/p/6001519.html

由於生成的Example當數據庫有改動的時候需要重新生成,所以不在原始文件裏修改,繼承一下;

重寫createCriteria() 方法,在內部類CustomCriteria裏實現需要or條件字段的方法;

package com.xxx.flight.policy.common.entity.policy.custom;

import com.xxx.flight.policy.common.entity.policy.PolicyPublicPriceExample;
import org.apache.commons.lang3.StringUtils;

public class CustomPolicyPublicPriceExample extends PolicyPublicPriceExample {

    public CustomCriteria createCriteria() {
        CustomCriteria criteria = customCreateCriteriaInternal();
        if (oredCriteria.size() == 0) {
            oredCriteria.add(criteria);
        }
        return criteria;
    }

    protected CustomCriteria customCreateCriteriaInternal() {
        CustomCriteria criteria = new CustomCriteria();
        return criteria;
    }

    public static class CustomCriteria extends PolicyPublicPriceExample.Criteria{

        public CustomCriteria andOrDepCode(String depTwoCode, String depThreeCode, String depFourCode){
            StringBuilder sb = new StringBuilder();
            sb.append("( 1 <> 1 ");
            if(StringUtils.isNotBlank(depTwoCode)){
                sb.append(" or dep_code like '%").append(depTwoCode).append("%'");
            }
            if(StringUtils.isNotBlank(depThreeCode)){
                sb.append(" or dep_code like '%").append(depThreeCode).append("%'");
            }
            if(StringUtils.isNotBlank(depFourCode)){
                sb.append(" or dep_code like '%").append(depFourCode).append("%'");
            }
            sb.append(")");
            return this;
        }

        public CustomCriteria andOrArrCode(String arrTwoCode, String arrThreeCode, String arrFourCode){
            StringBuilder sb = new StringBuilder();
            sb.append("( 1 <> 1 ");
            if(StringUtils.isNotBlank(arrTwoCode)){
                sb.append(" or arr_code like '%").append(arrTwoCode).append("%'");
            }
            if(StringUtils.isNotBlank(arrThreeCode)){
                sb.append(" or arr_code like '%").append(arrThreeCode).append("%'");
            }
            if(StringUtils.isNotBlank(arrFourCode)){
                sb.append(" or arr_code like '%").append(arrFourCode).append("%'");
            }
            sb.append(")");
            return this;
        }
    }

}

調用的時候直接用自定義查詢對象 CustomPolicyPublicPriceExample,這時候就多了andOrArrCode 和 andOrDepCode 方法;

public void updateBatch(PublicUpdateBatchRequest request) {
        PublicPrice vo = request.getPublicPrices().get(0);
        vo.setOperator(request.getOperator());
        vo.setChannelCode(request.getChannelCode());
        PolicyPublicPriceWithBLOBs po = PublicPriceConverter.convertToPo(vo);
        CustomPolicyPublicPriceExample example = new CustomPolicyPublicPriceExample();
        example.createCriteria()
                .andOrArrCode(request.getArrTwoCode(), request.getArrThreeCode(), request.getArrFourCode())
                .andOrDepCode(request.getDepTwoCode(), request.getDepThreeCode(), request.getDepFourCode())
                .andTicketAirlineEqualTo(request.getTicketAirline())
                .andTripTypeEqualTo(request.getTripType())
                .andPolicyIdEqualTo(request.getPolicyId())
                .andMainCabinEqualTo(request.getCabin())
                .andPolicyCodeEqualTo(request.getPolicyCode())
                .andPolicyStatusEqualTo(request.getStatus())
                .andOperatorNameEqualTo(request.getOptName())
                .andChannelCodeEqualTo(request.getChannelCode());
        publicPriceMapper.updateByExampleSelective(po, example);
    }

 

這裏就是and和or混合條件應用,看下Example的源碼有助理解。也可以直接寫sql,那樣就很簡單了,但是如果表字段非常多的時候寫sql就比較累了。

 

附 mybatis-generator-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <context id="context" targetRuntime="MyBatis3">
        <!--設置編碼格式-->
        <property name="javaFileEncoding" value="UTF-8"/>
        <!-- beginningDelimiter和endingDelimiter:指明數據庫的用於標記數據庫對象名的符號,比如ORACLE就是雙引號,MYSQL默認是`反引號; -->
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>

        <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/>

        <commentGenerator>
            <property name="suppressAllComments" value="false"/>
            <property name="suppressDate" value="true"/>
            <!-- 生成註釋 -->
            <property name="addRemarkComments" value="true"/>
        </commentGenerator>
        <!-- 數據庫連接  -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://127.0.0.0:3306/db?useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull"
                        userId="test" password="test"/>

        <!--要生成的 domain 模塊位置-->
        <javaModelGenerator targetPackage="com.xxx.flight.policy.common.entity.policy"
                            targetProject="../policy-common/src/main/java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
            <property name="comments" value="true"/>
        </javaModelGenerator>

        <!--要生成的Mapper.xml 文件位置-->
        <sqlMapGenerator targetPackage="mapper.policy" targetProject="src/main/resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>

        <!--&lt;!&ndash;要生成的 Mapper 接口類&ndash;&gt;-->
        <javaClientGenerator targetPackage="com.xxx.flight.policy.dao.mapper.policy"
                             targetProject="src/main/java" type="XMLMAPPER">
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>

        <table tableName="policy_public_price" enableSelectByExample="true" enableUpdateByExample="true">
            <!-- 數據庫生成id -->
            <generatedKey column="id" sqlStatement="mysql" identity="true"/>
            <!-- 數據的tinyint到代碼裏會轉成boolean 這裏制定轉成int-->
            <columnOverride column="rt_combine" javaType="java.lang.Integer"/>
            
        </table>

    </context>
</generatorConfiguration>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章