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>