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

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis Generator生成的Example类默认使用AND连接查询条件,如果要使用OR连接查询条件,可以使用Example类提供的or()方法。具体步骤如下: 1. 生成Example类 首先使用MyBatis Generator生成Example类,例如: ``` <table tableName="user" domainObjectName="User" > <generatedKey column="id" sqlStatement="MySql" identity="true" /> <property name="useActualColumnNames" value="true" /> </table> ``` 生成的UserExample类中包含了一些基本的查询方法,如: - andXxxEqualTo() - andXxxNotEqualTo() - andXxxGreaterThan() - andXxxGreaterThanOrEqualTo() - andXxxLessThan() - andXxxLessThanOrEqualTo() - andXxxLike() - andXxxNotLike() - andXxxIn() - andXxxNotIn() 2. 使用or()方法连接OR查询条件 在Example类中,可以使用or()方法连接OR查询条件。例如: ``` UserExample example = new UserExample(); example.or().andUsernameEqualTo("user1").andAgeGreaterThan(20); example.or().andUsernameEqualTo("user2").andAgeGreaterThan(30); ``` 以上代码表示查询满足以下条件之一的用户: - username等于"user1"且age大于20 - username等于"user2"且age大于30 其中,第一个or()方法连接的是第一个条件,第二个or()方法连接的是第二个条件。or()方法可以使用多次,每次连接一个条件。 3. 执行查询 最后,使用Mapper接口的selectByExample()方法执行查询: ``` List<User> userList = userMapper.selectByExample(example); ``` 以上代码会返回符合查询条件的用户列表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值