You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ibatis.apache.org by cb...@apache.org on 2009/10/07 07:29:59 UTC

svn commit: r822591 - in /ibatis/java/ibatis-3/trunk/ibatis-3-core/src: main/java/org/apache/ibatis/binding/ test/java/domain/blog/mappers/ test/java/org/apache/ibatis/binding/ test/java/org/apache/ibatis/session/

Author: cbegin
Date: Wed Oct  7 05:29:58 2009
New Revision: 822591

URL: http://svn.apache.org/viewvc?rev=822591&view=rev
Log:
Implemented multiple params with RowLimit support

Modified:
    ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperMethod.java
    ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/domain/blog/mappers/BlogMapper.java
    ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BindingTest.java
    ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundAuthorMapper.java
    ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundAuthorMapper.xml
    ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/session/SqlSessionTest.java

Modified: ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperMethod.java
URL: http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperMethod.java?rev=822591&r1=822590&r2=822591&view=diff
==============================================================================
--- ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperMethod.java (original)
+++ ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperMethod.java Wed Oct  7 05:29:58 2009
@@ -1,6 +1,5 @@
 package org.apache.ibatis.binding;
 
-import org.apache.ibatis.executor.Executor;
 import org.apache.ibatis.executor.resultset.RowLimit;
 import org.apache.ibatis.mapping.*;
 import org.apache.ibatis.session.SqlSession;
@@ -8,6 +7,9 @@
 import java.lang.reflect.Method;
 import java.sql.SQLException;
 import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
 
 public class MapperMethod {
 
@@ -18,20 +20,22 @@
   private String commandName;
 
   private Method method;
-  private int argCount;
 
   private boolean returnsList;
-  private boolean hasListBounds;
 
-  public MapperMethod(Method method, SqlSession sqlSession) {
+  private Integer rowLimitIndex;
+  private List<String> paramNames;
+  private List<Integer> paramPositions;
 
+  public MapperMethod(Method method, SqlSession sqlSession) {
+    paramNames = new ArrayList<String>();
+    paramPositions = new ArrayList<Integer>();
     this.sqlSession = sqlSession;
     this.method = method;
     this.config = sqlSession.getConfiguration();
-
     setupFields();
-    determineSelectMethod();
-    determineCommandType();
+    setupMethodSignature();
+    setupCommandType();
     validateStatement();
   }
 
@@ -56,27 +60,60 @@
     } else {
       throw new BindingException("Unkown execution method for: " + commandName);
     }
+    return result;
+  }
 
+  private Object executeForList(Object[] args) throws SQLException {
+    Object result;
+    if (rowLimitIndex != null) {
+      Object param = getParam(args);
+      RowLimit rowLimit = (RowLimit) args[rowLimitIndex];
+      result = sqlSession.selectList(commandName, param, rowLimit);
+    } else {
+      Object param = getParam(args);
+      result = sqlSession.selectList(commandName, param);
+    }
     return result;
   }
 
+  private Object getParam(Object[] args) {
+    final int paramCount = paramPositions.size();
+    if (args == null || paramCount == 0) {
+      return null;
+    } else if (paramPositions.size() == 1) {
+      return args[paramPositions.get(0)];
+    } else {
+      Map param = new HashMap();
+      for (int i=0; i < paramCount; i++) {
+        param.put(paramNames.get(i), args[paramPositions.get(i)]);
+      }
+      return param;
+    }
+  }
+
+  // Setup //
+
   private void setupFields() {
     this.commandName = method.getDeclaringClass().getName() + "." + method.getName();
-    this.argCount = method.getParameterTypes().length;
   }
 
-  private void determineSelectMethod() {
+  private void setupMethodSignature() {
     if (List.class.isAssignableFrom(method.getReturnType())) {
       returnsList = true;
-      if (argCount == 2) {
-        hasListBounds = true;
-      } else if (argCount == 3) {
-        hasListBounds = true;
+    }
+    final Class[] argTypes = method.getParameterTypes();
+    for (int i=0; i < argTypes.length; i++) {
+      if (RowLimit.class.isAssignableFrom(argTypes[i])) {
+        rowLimitIndex = i;
+      } else {
+        final String paramName = String.valueOf(paramPositions.size());
+        paramNames.add(paramName);
+        paramPositions.add(i);
       }
     }
   }
 
-  private void determineCommandType() {
+  private void setupCommandType() {
     MappedStatement ms = config.getMappedStatement(commandName);
     type = ms.getSqlCommandType();
     if (type == SqlCommandType.UNKNOWN) {
@@ -92,29 +129,4 @@
     }
   }
 
-  private Object executeForList(Object[] args) throws SQLException {
-    Object result;
-    if (hasListBounds) {
-      Object param = getParam(args);
-      RowLimit rowLimit = RowLimit.DEFAULT;
-      if (args.length == 3) {
-        rowLimit = new RowLimit((Integer) args[1], (Integer) args[2]);
-      } else if (args.length == 2) {
-        rowLimit = new RowLimit((Integer) args[0], (Integer) args[1]);
-      }
-      result = sqlSession.selectList(commandName, param, rowLimit);
-    } else {
-      Object param = getParam(args);
-      result = sqlSession.selectList(commandName, param);
-    }
-    return result;
-  }
-
-  private Object getParam(Object[] args) {
-    if (args == null) {
-      return null;
-    }
-    return args.length == 1 || args.length == 3 ? args[0] : null;
-  }
-
 }

Modified: ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/domain/blog/mappers/BlogMapper.java
URL: http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/domain/blog/mappers/BlogMapper.java?rev=822591&r1=822590&r2=822591&view=diff
==============================================================================
--- ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/domain/blog/mappers/BlogMapper.java (original)
+++ ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/domain/blog/mappers/BlogMapper.java Wed Oct  7 05:29:58 2009
@@ -1,13 +1,15 @@
 package domain.blog.mappers;
 
+import org.apache.ibatis.executor.resultset.RowLimit;
+
 import java.util.*;
 
 public interface BlogMapper {
 
-  List<Map> selectAllPosts(Object param);
+  List<Map> selectAllPosts();
 
-  List<Map> selectAllPosts(int offset, int limit);
+  List<Map> selectAllPosts(RowLimit rowLimit);
 
-  List<Map> selectAllPosts(Object param, int offset, int limit);
+  List<Map> selectAllPosts(RowLimit rowLimit, Object param);
 
 }

Modified: ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BindingTest.java
URL: http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BindingTest.java?rev=822591&r1=822590&r2=822591&view=diff
==============================================================================
--- ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BindingTest.java (original)
+++ ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BindingTest.java Wed Oct  7 05:29:58 2009
@@ -2,6 +2,7 @@
 
 import domain.blog.*;
 import org.apache.ibatis.session.*;
+import org.apache.ibatis.executor.resultset.RowLimit;
 import static org.junit.Assert.*;
 import org.junit.*;
 
@@ -65,6 +66,20 @@
   }
 
   @Test
+  public void shouldfindThreeSpecificPosts() throws Exception {
+    SqlSession session = sqlSessionFactory.openSession();
+    try {
+      BoundAuthorMapper mapper = session.getMapper(BoundAuthorMapper.class);
+      List<Post> posts = mapper.findThreeSpecificPosts(1,new RowLimit(1,1),3,5);
+      assertEquals(1,posts.size());
+      assertEquals(3,posts.get(0).getId());
+      session.rollback();
+    } finally {
+      session.close();
+    }
+  }
+
+  @Test
   public void shouldInsertAuthorWithSelectKey() {
     SqlSession session = sqlSessionFactory.openSession();
     try {

Modified: ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundAuthorMapper.java
URL: http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundAuthorMapper.java?rev=822591&r1=822590&r2=822591&view=diff
==============================================================================
--- ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundAuthorMapper.java (original)
+++ ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundAuthorMapper.java Wed Oct  7 05:29:58 2009
@@ -2,6 +2,7 @@
 
 import domain.blog.*;
 import org.apache.ibatis.annotations.*;
+import org.apache.ibatis.executor.resultset.RowLimit;
 
 import java.util.List;
 
@@ -63,4 +64,5 @@
 
   //======================================================
 
+  List<Post> findThreeSpecificPosts(int one, RowLimit rowLimit, int two, int three);
 }

Modified: ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundAuthorMapper.xml
URL: http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundAuthorMapper.xml?rev=822591&r1=822590&r2=822591&view=diff
==============================================================================
--- ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundAuthorMapper.xml (original)
+++ ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundAuthorMapper.xml Wed Oct  7 05:29:58 2009
@@ -26,5 +26,10 @@
     where id in (#{array[0]},#{array[1]},#{array[2]})
   </select>
 
+  <select id="findThreeSpecificPosts" parameterType="map" resultType="domain.blog.Post">
+    select * from post
+    where id in (#{0},#{1},#{2})
+  </select>
+
 
 </mapper>
\ No newline at end of file

Modified: ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/session/SqlSessionTest.java
URL: http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/session/SqlSessionTest.java?rev=822591&r1=822590&r2=822591&view=diff
==============================================================================
--- ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/session/SqlSessionTest.java (original)
+++ ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/session/SqlSessionTest.java Wed Oct  7 05:29:58 2009
@@ -3,6 +3,7 @@
 import domain.blog.*;
 import domain.blog.mappers.*;
 import org.apache.ibatis.BaseDataTest;
+import org.apache.ibatis.executor.resultset.RowLimit;
 import org.apache.ibatis.io.Resources;
 import org.apache.ibatis.mapping.Configuration;
 import static org.junit.Assert.*;
@@ -439,7 +440,7 @@
     SqlSession session = sqlMapper.openSession();
     try {
       BlogMapper mapper = session.getMapper(BlogMapper.class);
-      List<Map> posts = mapper.selectAllPosts(null);
+      List<Map> posts = mapper.selectAllPosts();
       assertEquals(5, posts.size());
     } finally {
       session.close();
@@ -451,7 +452,7 @@
     SqlSession session = sqlMapper.openSession();
     try {
       BlogMapper mapper = session.getMapper(BlogMapper.class);
-      List<Map> posts = mapper.selectAllPosts(null, 0, 2);
+      List<Map> posts = mapper.selectAllPosts(new RowLimit(0, 2), null);
       assertEquals(2, posts.size());
       assertEquals(1, posts.get(0).get("ID"));
       assertEquals(2, posts.get(1).get("ID"));
@@ -465,7 +466,7 @@
     SqlSession session = sqlMapper.openSession();
     try {
       BlogMapper mapper = session.getMapper(BlogMapper.class);
-      List<Map> posts = mapper.selectAllPosts(2, 3);
+      List<Map> posts = mapper.selectAllPosts(new RowLimit(2, 3));
       assertEquals(3, posts.size());
       assertEquals(3, posts.get(0).get("ID"));
       assertEquals(4, posts.get(1).get("ID"));