Pārlūkot izejas kodu

feat: 通用枚举新增注解处理方式

hubin 6 gadi atpakaļ
vecāks
revīzija
01acacc17a

+ 41 - 0
mybatis-plus-annotation/src/main/java/com/baomidou/mybatisplus/annotation/EnumValue.java

@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2011-2014, hubin (jobob@qq.com).
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.baomidou.mybatisplus.annotation;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * <p>
+ * 支持普通枚举类字段, 只用在enum类的字段上<br>
+ * 当实体类的属性是普通枚举,且是其中一个字段,使用该注解来标注枚举类里的那个属性对应字段<br>
+ * </p>
+ * <p>
+ * 使用方式参考 com.baomidou.mybatisplus.test.h2.H2StudentMapperTest
+ * </p>
+ *
+ * @author yuxiaobin
+ * @date 2018/8/30
+ */
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface EnumValue {
+
+}

+ 0 - 41
mybatis-plus-annotation/src/main/java/com/baomidou/mybatisplus/annotation/TableFieldEnumValue.java

@@ -1,41 +0,0 @@
-package com.baomidou.mybatisplus.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * <p>
- * 支持普通枚举类字段, 只用在enum类的字段上
- *
- * 当实体类的属性是普通枚举,且是其中一个字段,使用该注解来标注枚举类里的那个属性对应字段
- *
- * class Student{
- *     private Integer id;
- *     private String name;
- *     private GradeEnum grade;
- * }
- *
- * public enum GradeEnum{
- *     PRIMARY(1,"小学"),
- *     SECONDORY("2", "中学"),
- *     HIGH(3, "高中");
- *
- *      @TableFieldEnumValue
- *      private final int code;
- *      private final String descp;
- *
- * }
- * </p>
- *
- * @author yuxiaobin
- * @date 2018/8/30
- */
-@Documented
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.FIELD)
-public @interface TableFieldEnumValue {
-
-}

+ 1 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/MybatisConfiguration.java

@@ -58,7 +58,7 @@ public class MybatisConfiguration extends Configuration {
         System.out.println("| |  | || |_| || |_/ /| (_| || |_ | |\\__ \\  | |    | || |_| |\\__ \\");
         System.out.println("\\_|  |_/ \\__, |\\____/  \\__,_| \\__||_||___/  \\_|    |_| \\__,_||___/");
         System.out.println("          __/ |                                                   ");
-        System.out.println("         |___/                                              3.0-RELEASE");
+        System.out.println("         |___/                                              3.0.1");
         System.out.println();
     }
 

+ 19 - 3
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/handlers/EnumAnnotationTypeHandler.java

@@ -1,3 +1,18 @@
+/*
+ * Copyright (c) 2011-2020, hubin (jobob@qq.com).
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
 package com.baomidou.mybatisplus.extension.handlers;
 
 import java.lang.reflect.Field;
@@ -17,11 +32,11 @@ import com.baomidou.mybatisplus.core.toolkit.EnumUtils;
 
 /**
  * <p>
- * 支持
+ * EnumValue 注解自定义枚举属性转换器
  * </p>
  *
  * @author yuxiaobin
- * @date 2018/8/30
+ * @date 2018-08-30
  */
 public class EnumAnnotationTypeHandler<E extends Enum<E>> extends BaseTypeHandler<E> {
 
@@ -50,7 +65,8 @@ public class EnumAnnotationTypeHandler<E extends Enum<E>> extends BaseTypeHandle
             if (jdbcType == null) {
                 ps.setObject(i, tableEnumField == null ? parameter.name() : tableEnumField.get(parameter));
             } else {
-                ps.setObject(i, tableEnumField == null ? parameter.name() : tableEnumField.get(parameter), jdbcType.TYPE_CODE); // see r3589
+                // see r3589
+                ps.setObject(i, tableEnumField == null ? parameter.name() : tableEnumField.get(parameter), jdbcType.TYPE_CODE);
             }
         } catch (IllegalAccessException e) {
             LOGGER.error("unrecognized jdbcType, failed to set StringValue for type=" + parameter);

+ 5 - 3
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/DB2Dialect.java

@@ -55,12 +55,14 @@ public class DB2Dialect implements IDialect {
         }
         pagingSelect.append(" ) as temp_ where rownumber_ ");
 
-        // add the restriction to the outer select
+        // 20180829 modify by hepengju
+        // https://github.com/baomidou/mybatis-plus/issues/450
         if (offset > 0) {
             String endString = offset + StringPool.PLUS + limit;
-            pagingSelect.append("between ").append(offset).append("+1 and ").append(endString);
+            pagingSelect.append(" fetch first ").append(endString).append(" rows only) as temp_ where rownumber_ ")
+                .append("> ").append(offset);
         } else {
-            pagingSelect.append("<= ").append(limit);
+            pagingSelect.append(" fetch first ").append(limit).append(" rows only) as temp_ ");
         }
         return pagingSelect.toString();
     }

+ 16 - 8
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/spring/MybatisSqlSessionFactoryBean.java

@@ -49,6 +49,7 @@ import org.apache.ibatis.session.Configuration;
 import org.apache.ibatis.session.SqlSessionFactory;
 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 import org.apache.ibatis.transaction.TransactionFactory;
+import org.apache.ibatis.type.EnumOrdinalTypeHandler;
 import org.apache.ibatis.type.TypeHandler;
 import org.apache.ibatis.type.TypeHandlerRegistry;
 import org.mybatis.spring.SqlSessionFactoryBean;
@@ -64,7 +65,7 @@ import org.springframework.core.io.Resource;
 import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;
 
 import com.baomidou.mybatisplus.annotation.DbType;
-import com.baomidou.mybatisplus.annotation.TableFieldEnumValue;
+import com.baomidou.mybatisplus.annotation.EnumValue;
 import com.baomidou.mybatisplus.core.MybatisConfiguration;
 import com.baomidou.mybatisplus.core.MybatisXMLConfigBuilder;
 import com.baomidou.mybatisplus.core.config.GlobalConfig;
@@ -509,11 +510,17 @@ public class MybatisSqlSessionFactoryBean implements FactoryBean<SqlSessionFacto
             for (Class cls : classes) {
                 if (cls.isEnum()) {
                     if (IEnum.class.isAssignableFrom(cls)) {
+                        // 接口方式
                         typeHandlerRegistry.register(cls, EnumTypeHandler.class);
                     } else {
-                        //使用原生 EnumOrdinalTypeHandler
-                        dealEnumType(cls);
-                        typeHandlerRegistry.register(cls, EnumAnnotationTypeHandler.class);
+                        // 注解方式
+                        Class<?> clazz = dealEnumType(cls);
+                        if (null != clazz) {
+                            typeHandlerRegistry.register(cls, EnumAnnotationTypeHandler.class);
+                        } else {
+                            // 原生方式
+                            typeHandlerRegistry.register(cls, EnumOrdinalTypeHandler.class);
+                        }
                     }
                 }
             }
@@ -643,21 +650,22 @@ public class MybatisSqlSessionFactoryBean implements FactoryBean<SqlSessionFacto
 
     /**
      * 处理普通枚举
-     * 把带{@link TableFieldEnumValue}的field注册到处理器中
+     * 把带{@link EnumValue}的field注册到处理器中
      *
      * @param clazz
      */
-    protected void dealEnumType(Class<?> clazz) {
+    protected Class<?> dealEnumType(Class<?> clazz) {
         if (clazz.isEnum()) {
             Field[] fields = clazz.getDeclaredFields();
             for (Field f : fields) {
-                if (f.isAnnotationPresent(TableFieldEnumValue.class)) {
+                if (f.isAnnotationPresent(EnumValue.class)) {
                     f.setAccessible(true);
                     EnumAnnotationTypeHandler.addEnumType(clazz, f);
-                    return;
+                    return clazz;
                 }
             }
         }
+        return null;
     }
 
     /**

+ 2 - 2
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/entity/enums/GradeEnum.java

@@ -1,6 +1,6 @@
 package com.baomidou.mybatisplus.test.h2.entity.enums;
 
-import com.baomidou.mybatisplus.annotation.TableFieldEnumValue;
+import com.baomidou.mybatisplus.annotation.EnumValue;
 
 /**
  * <p>
@@ -20,7 +20,7 @@ public enum GradeEnum {
         this.descp = descp;
     }
 
-    @TableFieldEnumValue
+    @EnumValue
     private final int code;
 
     private final String descp;