MyBatis 映射器使用反射插入注解

MyBatis mapper to insert annotation with reflection

我有以下带有插入方法的 MyBatis Mapper:

String INSERT =SQLUtil.getFields(Consumer.class);
String INSERT_WITH_BRACE = SQLUtil.GetFieldsWithBrace(Consumer.class);
@Insert("INSERT INTO Consumer("+ INSERT  +") " +
        " VALUES " + INSERT_WITH_BRACE)

public int insert(Consumer consumer);

想法是使用SQLUtil生成样板代码;具有两个静态方法的实用程序 class。

@Component
public class SQLUtil {
    private static StringBuilder stringBuilder;
    public static String getFields(Class clazz) {
        stringBuilder = new StringBuilder();
        Field[] declaredFields = clazz.getDeclaredFields();
        int pos = 0;
        for(Field field: declaredFields){
            stringBuilder.append(field.getName());
            if(pos++ < declaredFields.length-1)
                stringBuilder.append(",");
        }
        return stringBuilder.toString();
    }

    public static String GetFieldsWithBrace(Class clazz) {
        int i=0;
        stringBuilder = new StringBuilder();
        Field[] declaredFields = clazz.getDeclaredFields();
        for(Field field: declaredFields){
            stringBuilder.append("#{");
            stringBuilder.append(field.getName());
            stringBuilder.append("}");
            if(i++ < declaredFields.length-1)
                stringBuilder.append(",");
        }
        return stringBuilder.toString();
    }
}

在这里,我利用反射从返回样板映射器的特定 class 中检索所有属性。但是我收到错误消息 "attribute must be Constant"。我真的不想自己写那些属性。我该如何解决?

Java 注释属性必须是常量。看一下 @InsertProvider 注释。如果你在你的SQLUtilsclass中写了一个生成整个INSERT语句的方法,你可以使用@InsertProvider直接调用该方法。