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/02/15 07:30:10 UTC

svn commit: r744613 - in /ibatis/trunk/java/ibatis-3: ./ ibatis-3-core/src/main/java/org/apache/ibatis/api/ ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/ ibatis-3-core/src/main/java/org/apache/ibatis/api/defaults/ ibatis-3-core/src/mai...

Author: cbegin
Date: Sun Feb 15 06:30:10 2009
New Revision: 744613

URL: http://svn.apache.org/viewvc?rev=744613&view=rev
Log:
Added mapper interface binding and annotations (currently annotations are unused)

Added:
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/CacheNamespace.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Collection.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Collections.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Delete.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Insert.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Param.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/QueryMethod.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Result.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/ResultClass.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Results.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Select.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Undefined.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Update.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/BindingException.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperFactory.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperMethod.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperMethodType.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperProxy.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/com/
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/com/domain/
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/com/domain/AuthorMapper.java
Modified:
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/SqlSession.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/defaults/DefaultSqlSession.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/api/SqlSessionTest.java
    ibatis/trunk/java/ibatis-3/version.properties

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/SqlSession.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/SqlSession.java?rev=744613&r1=744612&r2=744613&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/SqlSession.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/SqlSession.java Sun Feb 15 06:30:10 2009
@@ -1,6 +1,7 @@
 package org.apache.ibatis.api;
 
 import org.apache.ibatis.executor.result.ResultHandler;
+import org.apache.ibatis.mapping.Configuration;
 
 import java.util.List;
 
@@ -42,4 +43,8 @@
 
   void close();
 
+  Configuration getConfiguration();
+
+  <T> T getMapper(Class<T> type);
+
 }

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/CacheNamespace.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/CacheNamespace.java?rev=744613&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/CacheNamespace.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/CacheNamespace.java Sun Feb 15 06:30:10 2009
@@ -0,0 +1,16 @@
+package org.apache.ibatis.api.annotations;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface CacheNamespace {
+
+  String[] value();
+
+}
+
+

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Collection.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Collection.java?rev=744613&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Collection.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Collection.java Sun Feb 15 06:30:10 2009
@@ -0,0 +1,17 @@
+package org.apache.ibatis.api.annotations;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface Collection {
+
+  Class type();
+  String property();
+  String groupBy() default "";
+  //Result[] nestedResults() default {};
+
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Collections.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Collections.java?rev=744613&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Collections.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Collections.java Sun Feb 15 06:30:10 2009
@@ -0,0 +1,14 @@
+package org.apache.ibatis.api.annotations;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface Collections {
+
+  Collection[] value();
+
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Delete.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Delete.java?rev=744613&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Delete.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Delete.java Sun Feb 15 06:30:10 2009
@@ -0,0 +1,16 @@
+package org.apache.ibatis.api.annotations;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface Delete {
+
+  String[] value();
+
+}
+
+

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Insert.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Insert.java?rev=744613&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Insert.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Insert.java Sun Feb 15 06:30:10 2009
@@ -0,0 +1,16 @@
+package org.apache.ibatis.api.annotations;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface Insert {
+
+  String[] value();
+
+}
+
+

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Param.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Param.java?rev=744613&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Param.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Param.java Sun Feb 15 06:30:10 2009
@@ -0,0 +1,20 @@
+package org.apache.ibatis.api.annotations;
+
+import org.apache.ibatis.mapping.ParameterMode;
+import org.apache.ibatis.type.JdbcType;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.PARAMETER)
+public @interface Param {
+
+  String name();
+  ParameterMode mode() default ParameterMode.IN;
+  JdbcType jdbcType() default JdbcType.UNDEFINED;
+  Class typeHandler() default Undefined.class;
+  
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/QueryMethod.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/QueryMethod.java?rev=744613&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/QueryMethod.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/QueryMethod.java Sun Feb 15 06:30:10 2009
@@ -0,0 +1,16 @@
+package org.apache.ibatis.api.annotations;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface QueryMethod {
+
+  Class type();
+  String methodName();
+  String parameters() default "";
+  
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Result.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Result.java?rev=744613&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Result.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Result.java Sun Feb 15 06:30:10 2009
@@ -0,0 +1,21 @@
+package org.apache.ibatis.api.annotations;
+
+import org.apache.ibatis.type.JdbcType;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface Result {
+
+  String column() default "";
+  String property() default "";
+  String field() default "";
+  JdbcType jdbcType() default JdbcType.UNDEFINED;
+  Class typeHandler() default Undefined.class;
+  QueryMethod nestedQuery() default @QueryMethod(type= Undefined.class, methodName="", parameters="");
+
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/ResultClass.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/ResultClass.java?rev=744613&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/ResultClass.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/ResultClass.java Sun Feb 15 06:30:10 2009
@@ -0,0 +1,14 @@
+package org.apache.ibatis.api.annotations;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface ResultClass {
+
+  Class value();
+
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Results.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Results.java?rev=744613&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Results.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Results.java Sun Feb 15 06:30:10 2009
@@ -0,0 +1,14 @@
+package org.apache.ibatis.api.annotations;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface Results {
+
+  Result[] value();
+
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Select.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Select.java?rev=744613&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Select.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Select.java Sun Feb 15 06:30:10 2009
@@ -0,0 +1,16 @@
+package org.apache.ibatis.api.annotations;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface Select {
+
+  String[] value();
+
+}
+
+

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Undefined.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Undefined.java?rev=744613&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Undefined.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Undefined.java Sun Feb 15 06:30:10 2009
@@ -0,0 +1,4 @@
+package org.apache.ibatis.api.annotations;
+
+public @interface Undefined {
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Update.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Update.java?rev=744613&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Update.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/annotations/Update.java Sun Feb 15 06:30:10 2009
@@ -0,0 +1,16 @@
+package org.apache.ibatis.api.annotations;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface Update {
+
+  String[] value();
+
+}
+
+

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/defaults/DefaultSqlSession.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/defaults/DefaultSqlSession.java?rev=744613&r1=744612&r2=744613&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/defaults/DefaultSqlSession.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/defaults/DefaultSqlSession.java Sun Feb 15 06:30:10 2009
@@ -7,11 +7,14 @@
 import org.apache.ibatis.executor.result.ResultHandler;
 import org.apache.ibatis.mapping.Configuration;
 import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.binding.MapperFactory;
 
 import java.util.List;
 
 public class DefaultSqlSession implements SqlSession {
 
+  private MapperFactory mapperFactory;
+
   private Configuration configuration;
   private Executor executor;
 
@@ -19,6 +22,7 @@
   private boolean dirty;
 
   public DefaultSqlSession(Configuration configuration, Executor executor, boolean autoCommit) {
+    this.mapperFactory = new MapperFactory();
     this.configuration = configuration;
     this.executor = executor;
     this.autoCommit = autoCommit;
@@ -137,6 +141,14 @@
     }
   }
 
+  public Configuration getConfiguration() {
+    return configuration;
+  }
+
+  public <T> T getMapper(Class<T> type) {
+    return mapperFactory.getMapper(type, this);
+  }
+
   private boolean isCommitOrRollbackRequired(boolean force) {
     return (!autoCommit && dirty) || force;
   }

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/BindingException.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/BindingException.java?rev=744613&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/BindingException.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/BindingException.java Sun Feb 15 06:30:10 2009
@@ -0,0 +1,22 @@
+package org.apache.ibatis.binding;
+
+import org.apache.ibatis.mapping.SqlMapperException;
+
+public class BindingException extends SqlMapperException {
+
+  public BindingException() {
+    super();
+  }
+
+  public BindingException(String message) {
+    super(message);
+  }
+
+  public BindingException(String message, Throwable cause) {
+    super(message, cause);
+  }
+
+  public BindingException(Throwable cause) {
+    super(cause);
+  }
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperFactory.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperFactory.java?rev=744613&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperFactory.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperFactory.java Sun Feb 15 06:30:10 2009
@@ -0,0 +1,15 @@
+package org.apache.ibatis.binding;
+
+import org.apache.ibatis.api.SqlSession;
+
+public class MapperFactory {
+
+  public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
+    try {
+      return MapperProxy.newMapperProxy(type, sqlSession);
+    } catch (Exception e) {
+      throw new RuntimeException("Error getting mapper instance. Cause: " + e, e);
+    }
+  }
+
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperMethod.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperMethod.java?rev=744613&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperMethod.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperMethod.java Sun Feb 15 06:30:10 2009
@@ -0,0 +1,120 @@
+package org.apache.ibatis.binding;
+
+import org.apache.ibatis.api.SqlSession;
+import org.apache.ibatis.mapping.Configuration;
+
+import java.lang.reflect.Method;
+import java.sql.SQLException;
+import java.util.List;
+
+public class MapperMethod {
+
+  private SqlSession sqlSession;
+  private Configuration config;
+
+  private MapperMethodType type;
+  private String commandName;
+
+  private Method method;
+  private int argCount;
+
+  private boolean returnsList;
+  private boolean hasListBounds;
+
+  public MapperMethod(Method method, SqlSession sqlSession) {
+
+    this.sqlSession = sqlSession;
+    this.method = method;
+    this.config = sqlSession.getConfiguration();
+
+    setupFields();
+    determineSelectMethod();
+    determineCommandType();
+    validateStatement();
+  }
+
+  public Object execute(Object[] args) throws SQLException {
+    Object result;
+    if (MapperMethodType.INSERT == type) {
+      Object param = getParam(args);
+      result = sqlSession.insert(commandName, param);
+    } else if (MapperMethodType.UPDATE == type) {
+      Object param = getParam(args);
+      result = sqlSession.update(commandName, param);
+    } else if (MapperMethodType.DELETE == type) {
+      Object param = getParam(args);
+      result = sqlSession.delete(commandName, param);
+    } else if (MapperMethodType.SELECT == type) {
+      if (returnsList) {
+        result = executeForList(args);
+      } else {
+        Object param = getParam(args);
+        result = sqlSession.selectOne(commandName, param);
+      }
+    } else {
+      throw new BindingException("Unkown execution method for: " + commandName);
+    }
+
+    return result;
+  }
+
+  private void setupFields() {
+    this.commandName = method.getDeclaringClass().getName() + "." + method.getName();
+    this.argCount = method.getParameterTypes().length;
+  }
+
+  private void determineSelectMethod() {
+    if (List.class.isAssignableFrom(method.getReturnType())) {
+      returnsList = true;
+      if (argCount == 2) {
+      } else if (argCount == 3) {
+        hasListBounds = true;
+      }
+    }
+  }
+
+  private void determineCommandType() {
+    String methodName = method.getName();
+    if (methodName.startsWith("insert") || methodName.startsWith("create")) {
+      type = MapperMethodType.INSERT;
+    } else if (methodName.startsWith("update") || methodName.startsWith("save")) {
+      type = MapperMethodType.UPDATE;
+    } else if (methodName.startsWith("delete") || methodName.startsWith("remove")) {
+      type = MapperMethodType.DELETE;
+    } else if (methodName.startsWith("select") || methodName.startsWith("find")) {
+      type = MapperMethodType.SELECT;
+    } else {
+      throw new BindingException("Unkown execution method for: " + commandName);      
+    }
+  }
+
+  private void validateStatement() {
+    try {
+      config.getMappedStatement(commandName);
+    } catch (Exception e) {
+      throw new BindingException("Invalid bound statement (not found): " + commandName);
+    }
+  }
+
+  private Object executeForList(Object[] args) throws SQLException {
+    Object result;
+    if (hasListBounds) {
+      Object param = getParam(args);
+      int skip = ((Integer) args[1]);
+      int max = ((Integer) args[2]);
+      result = sqlSession.selectList(commandName, param, skip, max);
+    } 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 > 0 ? args[0] : null;
+  }
+
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperMethodType.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperMethodType.java?rev=744613&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperMethodType.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperMethodType.java Sun Feb 15 06:30:10 2009
@@ -0,0 +1,5 @@
+package org.apache.ibatis.binding;
+
+public enum MapperMethodType {
+  INSERT,UPDATE,DELETE,SELECT
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperProxy.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperProxy.java?rev=744613&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperProxy.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperProxy.java Sun Feb 15 06:30:10 2009
@@ -0,0 +1,28 @@
+package org.apache.ibatis.binding;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+
+import org.apache.ibatis.api.SqlSession;
+
+public class MapperProxy implements InvocationHandler {
+
+  private SqlSession sqlSession;
+
+  private <T> MapperProxy(SqlSession sqlSession) {
+    this.sqlSession = sqlSession;
+  }
+
+  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+    return new MapperMethod(method, sqlSession).execute(args);
+  }
+
+  public static <T> T newMapperProxy (Class<T> mapperInterface, SqlSession sqlSession) {
+    ClassLoader classLoader = mapperInterface.getClassLoader();
+    Class[] interfaces = new Class[]{mapperInterface};
+    MapperProxy proxy = new MapperProxy(sqlSession);
+    return (T)Proxy.newProxyInstance(classLoader, interfaces, proxy);
+  }
+
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/com/domain/AuthorMapper.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/com/domain/AuthorMapper.java?rev=744613&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/com/domain/AuthorMapper.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/com/domain/AuthorMapper.java Sun Feb 15 06:30:10 2009
@@ -0,0 +1,18 @@
+package com.domain;
+
+import domain.blog.Author;
+
+import java.util.List;
+
+public interface AuthorMapper {
+
+  List selectAllAuthors ();
+  Author selectAuthor(int id);
+  void insertAuthor(Author author);
+  int deleteAuthor(int id);
+  int updateAuthor(Author author);
+
+}
+
+
+

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/api/SqlSessionTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/api/SqlSessionTest.java?rev=744613&r1=744612&r2=744613&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/api/SqlSessionTest.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/api/SqlSessionTest.java Sun Feb 15 06:30:10 2009
@@ -11,6 +11,8 @@
 import java.io.Reader;
 import java.util.List;
 
+import com.domain.AuthorMapper;
+
 public class SqlSessionTest extends BaseDataTest {
   private static SqlSessionFactory sqlMapper;
 
@@ -287,4 +289,83 @@
     assertTrue(first != second);
   }
 
+  @Test
+  public void shouldSelectAuthorsUsingMapperClass() {
+    SqlSession session = sqlMapper.openSession();
+    try {
+      AuthorMapper mapper = session.getMapper(AuthorMapper.class);
+      System.out.println(mapper.getClass());
+      List authors = mapper.selectAllAuthors();
+      assertEquals(2,authors.size());
+    } finally {
+      session.close();
+    }
+  }
+
+  @Test
+  public void shouldExecuteSelectOneAuthorUsingMapperClass() {
+    SqlSession session = sqlMapper.openSession();
+    try {
+      AuthorMapper mapper = session.getMapper(AuthorMapper.class);
+      System.out.println(mapper.getClass());
+      Author author = mapper.selectAuthor(101);
+      assertEquals(101,author.getId());
+    } finally {
+      session.close();
+    }
+  }
+
+  @Test
+  public void shouldInsertAuthorUsingMapperClass() throws Exception {
+    SqlSession session = sqlMapper.openSession();
+    try {
+      AuthorMapper mapper = session.getMapper(AuthorMapper.class);
+      Author expected = new Author(500, "cbegin", "******", "cbegin@somewhere.com", "Something...", null);
+      mapper.insertAuthor(expected);
+      Author actual = mapper.selectAuthor(500);
+      assertNotNull(actual);
+      assertEquals(expected.getId(), actual.getId());
+      assertEquals(expected.getUsername(), actual.getUsername());
+      assertEquals(expected.getPassword(), actual.getPassword());
+      assertEquals(expected.getEmail(), actual.getEmail());
+      assertEquals(expected.getBio(), actual.getBio());
+    } finally {
+      session.close();
+    }
+  }
+
+  @Test
+  public void shouldDeleteAuthorUsingMapperClass() throws Exception {
+    SqlSession session = sqlMapper.openSession();
+    try {
+      AuthorMapper mapper = session.getMapper(AuthorMapper.class);
+      int count = mapper.deleteAuthor(101);
+      assertEquals(count, 1);
+      try{
+        mapper.selectAuthor(101);
+        fail("Expected exception.");
+      } catch(Exception e) {
+        assertEquals(ApiException.class, e.getClass());
+      }
+    } finally {
+      session.close();
+    }
+  }
+
+  @Test
+  public void shouldUpdateAuthorUsingMapperClass() throws Exception {
+    SqlSession session = sqlMapper.openSession();
+    try {
+      AuthorMapper mapper = session.getMapper(AuthorMapper.class);
+      Author expected = mapper.selectAuthor(101);
+      expected.setUsername("NewUsername");
+      int count = mapper.updateAuthor(expected);
+      assertEquals(count, 1);
+      Author actual = mapper.selectAuthor(101);
+      assertEquals(expected.getUsername(), actual.getUsername());
+    } finally {
+      session.close();
+    }
+  }
+
 }

Modified: ibatis/trunk/java/ibatis-3/version.properties
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/version.properties?rev=744613&r1=744612&r2=744613&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/version.properties (original)
+++ ibatis/trunk/java/ibatis-3/version.properties Sun Feb 15 06:30:10 2009
@@ -1,5 +1,5 @@
 #Build version info
-#Thu Jan 22 22:47:43 MST 2009
+#Sat Feb 14 23:23:36 MST 2009
 version=3.0.0
-buildDate=2009/01/22 22\:47
-buildNum=114
+buildDate=2009/02/14 23\:23
+buildNum=119