首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将SQL语句动态添加到JDBI StatementLocator中

将SQL语句动态添加到JDBI StatementLocator中
EN

Stack Overflow用户
提问于 2015-11-29 00:35:08
回答 1查看 804关注 0票数 1

如何将包含查询名、语句的Map的内容添加到Handle的语句缓存中,以便在Handle对象中使用,而不使用繁琐的模板组文件,也不影响在对象烦恼-while中使用原始SQL的能力,同时也保留了@Define功能?

代码语言:javascript
复制
Map<String,String> querySource = new HashMap<>();
querySource.put("sql/BasicDao/simpleSelect","Select * FROM <schemaName>.table_of_vast_importance")

handle.somehowAddToStatementCache(querySource)

...

public interface BasicDao {

    @SqlQuery("sql/BasicDao/simpleSelect")
    BasicBean selectFromTable(@Define("schemaName") String);

    @SqlQuery("SELECT ... FROM ...")
    BasicBean moreComplicatedSelect(@Define("schemaName) String)

    ...


}

我希望以编程方式为SQL对象在app加载上生成基本CRUD操作,以避免为数据库中每个表的每个操作编写样板SQL。问题是,@Define似乎只在用@UseStringTemplate3StatementLocator注释SQL对象接口时才起作用;然而,StringTemplate3StatementLocator似乎没有提供一种明显的方法来添加动态生成的查询。

EN

回答 1

Stack Overflow用户

发布于 2015-12-02 21:14:40

如果考虑运行时(字节码)代码生成的字节巴迪,下面是在我的机器上进行单元测试的代码。这显示了一个前/后示例。希望能帮上忙。

原始资料来源:

代码语言:javascript
复制
@RegisterMapper(TimezoneJDBIMapper.class)
public abstract class TimezoneJDBI {

    @SqlUpdate("INSERT INTO timezone (timez_name, version) VALUES (:timezName, :version)")
    @GetGeneratedKeys
    public abstract long insert(@BindBean Timezone timezone);

}

没有注释的新源:

代码语言:javascript
复制
public abstract class TimezoneJDBI {
    @GetGeneratedKeys
    public abstract long insert(Timezone timezone);
}

现在,使用onDemand完全是动态的:

代码语言:javascript
复制
Class<? extends TimezoneJDBI> clazz = new ByteBuddy()
        .withModifiers(TypeManifestation.ABSTRACT)
        .subclass(TimezoneJDBI.class)
        .method(ElementMatchers.named("insert"))
        .withoutCode()
        .annotateMethod(new SqlUpdateImpl("INSERT INTO timezone (timez_name, version) VALUES (:timezName, :version)"))
        .annotateParameter(0, new BindBeanImpl())
        .annotateType(new RegisterMapperImpl(new Class[]{TimezoneJDBIMapper.class}))
        .make().load(getClass().getClassLoader(), ClassLoadingStrategy.Default.WRAPPER).getLoaded();

TimezoneJDBI dao = jdbi.onDemand(clazz);

对于注释,需要一些帮助类(如Buddy文档中所述,每个注释都需要一个类):

代码语言:javascript
复制
class SqlUpdateImpl implements SqlUpdate {

    private String value;

    public SqlUpdateImpl(String value) {
        this.value = value;
    }

    @Override
    public Class<? extends Annotation> annotationType() {
        return SqlUpdate.class;
    }

    @Override
    public String value() {
        return value;
    }
}

class RegisterMapperImpl implements RegisterMapper {

    private Class<? extends ResultSetMapper<?>>[] value;

    public RegisterMapperImpl(Class<? extends ResultSetMapper<?>>[] value) {
        this.value = value;
    }

    @Override
    public Class<? extends Annotation> annotationType() {
        return RegisterMapper.class;
    }

    @Override
    public Class<? extends ResultSetMapper<?>>[] value() {
        return value;
    }
}

class BindBeanImpl implements BindBean {

    @Override
    public Class<? extends Annotation> annotationType() {
        return BindBean.class;
    }

    @Override
    public String value() {
        return BindBeanImpl.BARE_BINDING;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33978078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档