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&characterEncoding=UTF-8&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>
<!--<!–要生成的 Mapper 接口类–>-->
<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>