Skip to content

自定义查询

org.huiche.jdbc.JdbcExecutor 是huiche底层的jdbc执行器,如果dao不能满足你的要求, 可以使用JdbcExecutor进行操作

使用huiche-spring-boot-starter时,会自动注册JdbcExecutor为bean,进行注入即可使用

JdbcExecutor 支持传入原生sql和参数,也支持传入org.huiche.core.ast.Statement 这个是huiche的SQL抽象语法树(AST)封装的语句对象

原生SQL查询

java
@Autowired
private JdbcExecutor executor;

public void helloworld(){
    String sql = "xxx";
    List<Object> params = new ArrayList();
    // 执行SQL
    executor.sql(sql,params).update();
    // 执行SQL并处理自增值,用于多行自增
    executor.sql(sql,params).updateAndPopulateKey();
    // 执行SQL并处理自增值,用于单行自增
    executor.sql(sql,params).updateAndPopulateKeySingle();
    // 查询是否存在,底层直接判断rs.next()
    executor.sql(sql,params).queryExists();
    // 查询并转换,返回MappedQuery,MappedQuery进一步操作时,才会真正进行数据库查询操作
    // 通过行转换器查询
    MappedQuery<T> mappedQuery = executor.sql(sql,params).query(RowMapper<T> mapper);
    // 通过类查询
    MappedQuery<T> mappedQuery = executor.sql(sql,params).query(Class<T> targetClass);
    // 查询为Map,默认key为列名转java属性名(snake_case->camelCase),列重复会覆盖
    MappedQuery<Map<String,Object> mappedQuery = executor.sql(sql,params).query();
    // 查询为Map,自定义key取值
    MappedQuery<Map<String,Object> mappedQuery = executor.sql(sql,params).query(BiFunction<String, String, String> keyNamingStrategy);

    // 查询为list,默认返回ArrayList,可传入List来调整
    List<T> list = mappedQuery.list()
    // 查询为set,默认返回LinkedHashSet,可传入Set实例来调整
    Set<T> set = mappedQuery.set()
    // 查询为collection,需要提供一个集合实例来接收数据,比如HashSet
    // 建议传入有序集合,否则无法保证顺序与数据库查询结果一致
    HashSet<T> collection = mapperdQuery.collection(new HashSet());
    // 查询为stream, 如果需要stream操作,可以进行此查询
    // 如果结果类中有Reader或InputStream等流属性,也需要使用stream查询,且在stream操作结束前完成读取转换
    Stream<T> stream = mapperdQuery.streeam();
    // 查询返回的第一条数据,底层调用了ps.setMaxRows(1),需要自行确保查询条件下只返回一条数据
    T first = mapperdQuery.first();
    // 查询为Optional
    Optional<T> optional = mapperdQuery.optional();
}

内置Statement语句

使用Statement语句跟原生sql没有任何区别,只是sql构造的区别, 使用内置Statement语句,会使用对应方言进行转换,转换后即为原生sql语句

java
@Autowired
private JdbcExecutor executor;

public void helloworld(){
    // 创建一个insert语句
    Insert insert = Sql.insertInto(Artist.class).columns(xxx).values(xxx);
    // 创建一个delete语句
    Delete delete = Sql.deleteFrom(Artist.class).where(xxx);
    // 创建一个update语句
    Update update = Sql.update(Artist.class).set(xxx,xxx).where(xxx);
    // 创建一个select语句
    Select select = Sql.select(xxx).from(Artist.class).join(xxx).on(xxx).groupBy(xxx).having(xxx).orderBy(xxx).limit(xxx);
    // 以上均为Statement的子类, 可以直接传递给JdbcExecutor使用
    // 后续使用方法与原生SQL一致
    executor.sql(insert).updateAndPopulateKeySingle();
    executor.sql(delete).update();
    executor.sql(update).update();
    executor.sql(select).query(Artist.class).list();
}

Sql 还提供更多的SQL语句,函数等,具体可了解

如果huiche-ast内置的SQL语句,函数等无法满足需求, 可以进行自定义,点击下一页了解