瀏覽代碼

#95 Github, selectItems contains #{} ${},

which will be translated to ?, and it may be in a function: power(#{myInt},2)

It's better to Re-write DefaultParameterHandler.setParameters
yuxiaobin 8 年之前
父節點
當前提交
ce30fe5624

+ 1 - 1
src/main/java/com/baomidou/mybatisplus/parser/AbstractSqlParser.java

@@ -29,7 +29,7 @@ import org.apache.ibatis.logging.LogFactory;
 public abstract class AbstractSqlParser {
 
     // 日志
-    protected static final Log logger = LogFactory.getLog(AbstractSqlParser.class);
+    protected final Log logger = LogFactory.getLog(this.getClass());
 
     /**
      * <p>

+ 7 - 1
src/main/java/com/baomidou/mybatisplus/plugins/pagination/optimize/JsqlParserCountOptimize.java

@@ -65,7 +65,13 @@ public class JsqlParserCountOptimize extends AbstractSqlParser {
                 plainSelect.setOrderByElements(null);
                 sqlInfo.setOrderBy(false);
             }
-
+            //#95 Github, selectItems contains #{} ${}, which will be translated to ?, and it may be in a function: power(#{myInt},2)
+            for (SelectItem item : plainSelect.getSelectItems()) {
+                if(item.toString().contains("?")){
+                    sqlInfo.setSql(String.format(SqlUtils.SQL_BASE_COUNT, selectStatement.toString()));
+                    return sqlInfo;
+                }
+            }
             // 包含 distinct、groupBy不优化
             if (distinct != null || CollectionUtils.isNotEmpty(groupBy)) {
                 sqlInfo.setSql(String.format(SqlUtils.SQL_BASE_COUNT, selectStatement.toString()));

+ 59 - 0
src/test/java/com/baomidou/mybatisplus/test/h2/H2UserTest.java

@@ -25,6 +25,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.plugins.Page;
+import com.baomidou.mybatisplus.test.h2.entity.mapper.H2UserMapper;
 import com.baomidou.mybatisplus.test.h2.entity.persistent.H2User;
 import com.baomidou.mybatisplus.test.h2.service.IH2UserService;
 
@@ -43,6 +44,9 @@ public class H2UserTest extends H2Test {
     @Autowired
     private IH2UserService userService;
 
+    @Autowired
+    H2UserMapper userMapper;
+
     @BeforeClass
     public static void initDB() throws SQLException, IOException {
         @SuppressWarnings("resource")
@@ -427,4 +431,59 @@ public class H2UserTest extends H2Test {
         }
 
     }
+
+    @Test
+    public void testQueryWithParamInSelectStatement(){
+        Map<String,Object> param = new HashMap<>();
+        String nameParam = "selectStmtParam";
+        param.put("nameParam", nameParam);
+        param.put("ageFrom", 1);
+        param.put("ageTo", 100);
+        List<H2User> list = userService.queryWithParamInSelectStatememt(param);
+        Assert.assertNotNull(list);
+        for(H2User u:list){
+            Assert.assertEquals(nameParam, u.getName());
+            Assert.assertNotNull(u.getId());
+        }
+    }
+    @Test
+    public void testQueryWithParamInSelectStatement4Page(){
+        Map<String,Object> param = new HashMap<>();
+        String nameParam = "selectStmtParam";
+        param.put("nameParam", nameParam);
+        param.put("ageFrom", 1);
+        param.put("ageTo", 100);
+        Page<H2User> page = userService.queryWithParamInSelectStatememt4Page(param, new Page<H2User>(0,10));
+        Assert.assertNotNull(page.getRecords());
+        for(H2User u:page.getRecords()){
+            Assert.assertEquals(nameParam, u.getName());
+            Assert.assertNotNull(u.getId());
+        }
+        Assert.assertNotEquals(0, page.getTotal());
+    }
+
+    @Test
+    public void testSelectCountWithParamInSelectItems(){
+        Map<String,Object> param = new HashMap<>();
+        String nameParam = "selectStmtParam";
+        param.put("nameParam", nameParam);
+        param.put("ageFrom", 1);
+        param.put("ageTo", 100);
+        int count = userService.selectCountWithParamInSelectItems(param);
+        Assert.assertNotEquals(0, count);
+    }
+
+    @Test
+    public void testPageWithDollarParamInSelectItems(){
+        Map<String,Object> param = new HashMap<>();
+        String nameParam = "selectStmtParam";
+        param.put("nameParam", nameParam);
+        param.put("ageFrom", 1);
+        param.put("ageTo", 100);
+        Page<H2User> page = new Page<H2User>(0,10);
+        userMapper.selectUserWithDollarParamInSelectStatememt4Page(param, page);
+        Assert.assertNotEquals(0, page.getTotal());
+
+    }
+
 }

+ 1 - 1
src/test/java/com/baomidou/mybatisplus/test/h2/config/DBConfig.java

@@ -27,7 +27,7 @@ public class DBConfig {
     public DataSource dataSource() throws SQLException {
         SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
         dataSource.setDriver(new Driver());
-        dataSource.setUrl("jdbc:h2:mem:AZ;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE");
+        dataSource.setUrl("jdbc:h2:mem:test;MODE=mysql;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE");
         dataSource.setUsername("sa");
         dataSource.setPassword("");
         return dataSource;

+ 26 - 0
src/test/java/com/baomidou/mybatisplus/test/h2/entity/mapper/H2UserMapper.java

@@ -1,6 +1,7 @@
 package com.baomidou.mybatisplus.test.h2.entity.mapper;
 
 import java.util.List;
+import java.util.Map;
 
 import org.apache.ibatis.annotations.Insert;
 import org.apache.ibatis.annotations.Param;
@@ -54,4 +55,29 @@ public interface H2UserMapper extends SuperMapper<H2User> {
             "insert into h2user(name,version) values( #{name}, #{version})"
     )
     int myInsertWithoutParam(H2User user1);
+
+
+    @Select(" select test_id as id, power(#{ageFrom},2), 'abc?zhazha', CAST(#{nameParam} AS VARCHAR) as name " +
+            " from h2user " +
+            " where age>#{ageFrom} and age<#{ageTo} ")
+    List<H2User> selectUserWithParamInSelectStatememt(Map<String,Object> param);
+
+    @Select(" select test_id as id, power(#{ageFrom},2), 'abc?zhazha', CAST(#{nameParam} AS VARCHAR) as name " +
+            " from h2user " +
+            " where age>#{ageFrom} and age<#{ageTo} ")
+    List<H2User> selectUserWithParamInSelectStatememt4Page(Map<String,Object> param, Page<H2User> page);
+
+    @Select(" select test_id as id, power(${ageFrom},2), '${nameParam}' as name " +
+            " from h2user " +
+            " where age>#{ageFrom} and age<#{ageTo} ")
+    List<H2User> selectUserWithDollarParamInSelectStatememt4Page(Map<String,Object> param, Page<H2User> page);
+
+
+
+    @Select("select count(1) from (" +
+            "select test_id as id, CAST(#{nameParam} AS VARCHAR) as name" +
+            " from h2user " +
+            " where age>#{ageFrom} and age<#{ageTo} " +
+            ") a")
+    int selectCountWithParamInSelectItems(Map<String,Object> param);
 }

+ 10 - 0
src/test/java/com/baomidou/mybatisplus/test/h2/service/IH2UserService.java

@@ -15,6 +15,10 @@
  */
 package com.baomidou.mybatisplus.test.h2.service;
 
+import java.util.List;
+import java.util.Map;
+
+import com.baomidou.mybatisplus.plugins.Page;
 import com.baomidou.mybatisplus.service.IService;
 import com.baomidou.mybatisplus.test.h2.entity.persistent.H2User;
 
@@ -35,4 +39,10 @@ public interface IH2UserService extends IService<H2User> {
     int myInsertWithoutParam(String name, int version);
 
     int myUpdate(Long id, String name);
+
+    List<H2User> queryWithParamInSelectStatememt(Map<String,Object> param);
+
+    Page<H2User> queryWithParamInSelectStatememt4Page(Map<String,Object> param, Page<H2User> page);
+
+    int selectCountWithParamInSelectItems(Map<String,Object> param);
 }

+ 21 - 0
src/test/java/com/baomidou/mybatisplus/test/h2/service/impl/H2UserServiceImpl.java

@@ -15,9 +15,13 @@
  */
 package com.baomidou.mybatisplus.test.h2.service.impl;
 
+import java.util.List;
+import java.util.Map;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import com.baomidou.mybatisplus.plugins.Page;
 import com.baomidou.mybatisplus.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.test.h2.entity.mapper.H2UserMapper;
 import com.baomidou.mybatisplus.test.h2.entity.persistent.H2User;
@@ -62,4 +66,21 @@ public class H2UserServiceImpl extends ServiceImpl<H2UserMapper, H2User> impleme
     public int myUpdate(Long id, String name) {
         return userMapper.myUpdateWithNameId(id, name);
     }
+
+    @Override
+    public List<H2User> queryWithParamInSelectStatememt(Map<String, Object> param) {
+        return userMapper.selectUserWithParamInSelectStatememt(param);
+    }
+
+    @Override
+    public Page<H2User> queryWithParamInSelectStatememt4Page(Map<String, Object> param, Page<H2User> page) {
+        page.setSearchCount(true);
+        userMapper.selectUserWithParamInSelectStatememt4Page(param, page);
+        return page;
+    }
+
+    @Override
+    public int selectCountWithParamInSelectItems(Map<String, Object> param) {
+        return userMapper.selectCountWithParamInSelectItems(param);
+    }
 }