扩展 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>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值