java - MyBatis 映射器通过反射插入注释

标签 java reflection mybatis

我有下面带有插入方法的 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生成样板代码;一个具有两个静态方法的实用程序类。

@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();
    }
}

在这里,我利用反射从返回样板映射器的特定类中检索所有属性。但我收到错误消息“属性必须是常量”。我真的不想自己写这些属性。我该如何解决这个问题?

最佳答案

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

关于java - MyBatis 映射器通过反射插入注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62232178/

相关文章:

java - Mysql更新用户密码

java - 将结果分组到List中,List是Mybatis(Mapper)和Java中的属性

java - 如何使用 libGDX 设置纵向模式?

java - 子类化或实现接口(interface)

java - 我的 java 代码有一个明显的错误。为什么它会编译和运行?

java - 如何为 Java 类字段生成准确的泛型表达式?

c# - 通过将函数名称作为字符串传递来动态调用任何函数

java - 为什么接口(interface)方法调用比具体调用慢?

python - 检查 Python 函数是否引用了任何超出范围的内容

java - Mybatis批处理