栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在JDBI中使用IN运算符?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在JDBI中使用IN运算符?

有两种方法可以实现它。

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;    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/384036.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号