From 4a3ea462b4c0ddb56cbd05d6bc2252f93b6b18d0 Mon Sep 17 00:00:00 2001 From: wkc <978997012@qq.com> Date: Fri, 13 Mar 2026 10:27:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=B2=E5=B1=9E=E5=85=B3?= =?UTF-8?q?=E7=B3=BB=E5=88=97=E8=A1=A8=E5=88=86=E9=A1=B5SQL=E6=8B=BC?= =?UTF-8?q?=E6=8E=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../collection/CcdiStaffFmyRelationMapper.xml | 4 +- .../CcdiStaffFmyRelationMapperTest.java | 112 ++++++++++++++++++ 2 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 ccdi-info-collection/src/test/java/com/ruoyi/info/collection/mapper/CcdiStaffFmyRelationMapperTest.java diff --git a/ccdi-info-collection/src/main/resources/mapper/info/collection/CcdiStaffFmyRelationMapper.xml b/ccdi-info-collection/src/main/resources/mapper/info/collection/CcdiStaffFmyRelationMapper.xml index 119907a..b1b5691 100644 --- a/ccdi-info-collection/src/main/resources/mapper/info/collection/CcdiStaffFmyRelationMapper.xml +++ b/ccdi-info-collection/src/main/resources/mapper/info/collection/CcdiStaffFmyRelationMapper.xml @@ -47,7 +47,7 @@ FROM ccdi_staff_fmy_relation r LEFT JOIN ccdi_base_staff s ON r.person_id = s.id_card - r.is_emp_family = 1 + AND r.is_emp_family = 1 AND r.person_id = #{query.personId} @@ -102,7 +102,7 @@ FROM ccdi_staff_fmy_relation r LEFT JOIN ccdi_base_staff s ON r.person_id = s.id_card - r.is_emp_family = 1 + AND r.is_emp_family = 1 AND r.person_id = #{query.personId} diff --git a/ccdi-info-collection/src/test/java/com/ruoyi/info/collection/mapper/CcdiStaffFmyRelationMapperTest.java b/ccdi-info-collection/src/test/java/com/ruoyi/info/collection/mapper/CcdiStaffFmyRelationMapperTest.java new file mode 100644 index 0000000..a13f6c0 --- /dev/null +++ b/ccdi-info-collection/src/test/java/com/ruoyi/info/collection/mapper/CcdiStaffFmyRelationMapperTest.java @@ -0,0 +1,112 @@ +package com.ruoyi.info.collection.mapper; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.info.collection.domain.dto.CcdiStaffFmyRelationQueryDTO; +import org.apache.ibatis.builder.xml.XMLMapperBuilder; +import org.apache.ibatis.mapping.BoundSql; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.scripting.xmltags.XMLLanguageDriver; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.apache.ibatis.type.TypeAliasRegistry; +import org.junit.jupiter.api.Test; + +import javax.sql.DataSource; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class CcdiStaffFmyRelationMapperTest { + + private static final String RESOURCE = "mapper/info/collection/CcdiStaffFmyRelationMapper.xml"; + + @Test + void selectRelationPage_shouldRenderWhitespaceBeforeDynamicAndClause() throws Exception { + MappedStatement mappedStatement = loadMappedStatement( + "com.ruoyi.info.collection.mapper.CcdiStaffFmyRelationMapper.selectRelationPage"); + + CcdiStaffFmyRelationQueryDTO queryDTO = new CcdiStaffFmyRelationQueryDTO(); + queryDTO.setPersonId("320101199001010011"); + String sql = renderSql(mappedStatement, Map.of( + "page", new Page<>(1, 10), + "query", queryDTO + )); + + assertTrue(sql.contains("WHERE r.is_emp_family = 1 AND r.person_id = ?"), sql); + assertFalse(sql.contains("1AND"), sql); + } + + private MappedStatement loadMappedStatement(String statementId) throws Exception { + Configuration configuration = new Configuration(); + configuration.setEnvironment(new Environment("test", new JdbcTransactionFactory(), new NoOpDataSource())); + registerTypeAliases(configuration.getTypeAliasRegistry()); + configuration.getLanguageRegistry().register(XMLLanguageDriver.class); + configuration.addMapper(CcdiStaffFmyRelationMapper.class); + + try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream(RESOURCE)) { + XMLMapperBuilder xmlMapperBuilder = + new XMLMapperBuilder(inputStream, configuration, RESOURCE, configuration.getSqlFragments()); + xmlMapperBuilder.parse(); + } + return configuration.getMappedStatement(statementId); + } + + private String renderSql(MappedStatement mappedStatement, Map params) { + BoundSql boundSql = mappedStatement.getBoundSql(new HashMap<>(params)); + return boundSql.getSql().replaceAll("\\s+", " ").trim(); + } + + private void registerTypeAliases(TypeAliasRegistry typeAliasRegistry) { + typeAliasRegistry.registerAlias("map", Map.class); + } + + private static class NoOpDataSource implements DataSource { + + @Override + public java.sql.Connection getConnection() { + throw new UnsupportedOperationException("Not required for SQL rendering tests"); + } + + @Override + public java.sql.Connection getConnection(String username, String password) { + throw new UnsupportedOperationException("Not required for SQL rendering tests"); + } + + @Override + public java.io.PrintWriter getLogWriter() { + return null; + } + + @Override + public void setLogWriter(java.io.PrintWriter out) { + } + + @Override + public void setLoginTimeout(int seconds) { + } + + @Override + public int getLoginTimeout() { + return 0; + } + + @Override + public java.util.logging.Logger getParentLogger() { + return java.util.logging.Logger.getGlobal(); + } + + @Override + public T unwrap(Class iface) { + throw new UnsupportedOperationException("Not supported"); + } + + @Override + public boolean isWrapperFor(Class iface) { + return false; + } + } +}