有两种方法可以实现它。
1 。使用
UseStringTemplate3StatementLocator
该注释期望StringTemplate中具有SQL语句的组文件
说我有这个文件PersonExternalizedSqlDAO
// PersonExternalizedSqlDAO.javapackage com.daoexp.dao;@@ExternalizedSqlViaStringTemplate3@RegisterMapper(PersonMapper.class)public interface PersonExternalizedSqlDAO { @SqlQuery List<Person> getPersonByNames(@BindIn("names") List<String> names);}由于我们正在使用
UseStringTemplate3StatementLocator,因此必须
*.sql.stg在相同的类路径中创建文件。
例如: 在
resources/com/daoexp/dao/PersonExternalizedSqlDAO.sql.stg
group PersonExternalizedSqlDAO;getPersonByNames(names) ::= << select * from person where name in (<names>)>>
现在,您应该可以进行查询了,没有任何问题。
2 。另一种方法是使用
ArgumentFactory来处理JDBI的自定义数据类型(在本例中为List)
@Bind。这是最可取的方法。
因此,创建此列表参数工厂
public class ListArgumentFactory implements ArgumentFactory<List> { @Override public boolean accepts(Class<?> expectedType, Object value, StatementContext ctx) { return value instanceof List; } @Override public Argument build(Class<?> expectedType, final List value, StatementContext ctx) { return new Argument() { @Override public void apply(int position, PreparedStatement statement, StatementContext ctx) throws SQLException { String type = null; if(value.get(0).getClass() == String.class){ type = "varchar"; } else if(value.get(0).getClass() == Integer.class){ // For integer and so on... } else { // throw error.. type not handled } Array array = ctx.getConnection().createArrayOf(type, value.toArray()); statement.setArray(position, array); } }; }}这堂课做什么?
- 接受List的实例
- 将整数/字符串列表转换为数组,并与准备好的语句绑定
确保使用您的DBI实例注册此参数工厂。
final DBIFactory factory = new DBIFactory();final DBI jdbi = factory.build(environment, configuration.getDataSourceFactory(), "h2");jdbi.registerArgumentFactory(new ListArgumentFactory());
现在,您应该能够以
List更简单的方式使用来查询
@Bind。而已。
@RegisterMapper(PersonMapper.class)public interface PersonDAO { @SqlQuery("select * from person where name = any(:names)") List<Person> getPersonByNames(@Bind("names") List<String> names);}参考:
- jdbi文件
附加信息:
// PersonMapper.javapublic class PersonMapper implements ResultSetMapper<Person> { public Person map(int index, ResultSet r, StatementContext ctx) throws SQLException { Person person = new Person(); person.setId(r.getInt("id")); person.setName(r.getString("name")); return person; }}


