如何将包含查询名、语句的Map的内容添加到Handle的语句缓存中,以便在Handle对象中使用,而不使用繁琐的模板组文件,也不影响在对象烦恼-while中使用原始SQL的能力,同时也保留了@Define功能?
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似乎没有提供一种明显的方法来添加动态生成的查询。
发布于 2015-12-02 21:14:40
如果考虑运行时(字节码)代码生成的字节巴迪,下面是在我的机器上进行单元测试的代码。这显示了一个前/后示例。希望能帮上忙。
原始资料来源:
@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);
}没有注释的新源:
public abstract class TimezoneJDBI {
@GetGeneratedKeys
public abstract long insert(Timezone timezone);
}现在,使用onDemand完全是动态的:
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文档中所述,每个注释都需要一个类):
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;
}
}https://stackoverflow.com/questions/33978078
复制相似问题