携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情
如何在sql查询时获取查询字段的元数据信息
前文
在进行数据库数据查询时,一般情况下的返回结果都是数据库的数据本身。如果我们需要数据库字段信息,那么又需要怎么做呢?这就涉及到本文的内容,如何进行数据库元信息的查询。
利用jdbc直接查询
首先来看第一种方案,该方案为利用jdbc直接进行数据库的连接,并在连接的结果中进行数据库元信息的获取。看一下具体执行的关键代码:
connection = DataSourceUtils.getConnection(datasource);
statement = connection.createStatement();
resultSet = statement.executeQuery(sql);
data = new ArrayList<>();
ResultSetMetaData metaData = resultSet.getMetaData();
如上所示,为采用jdbc连接时直接进行数据库元信息的获取。可以看到首先我们需要进行数据库的连接,并在连接后进行数据库sql语句的执行。执行后我们将得到数据库的查询结果集。正常来说,我们一般是直接进行结果集的处理。但其实结果集中已经包含了元数据信息的内容。我们只需要对于结果集进行额外的处理,即可得到查询数据的元信息,得到的信息如下图所示:
很明显,通过这种方式,我们可以直接从结果集中获取到数据的元信息,再进行下一步的数据处理。
利用mybatis拦截器进行查询
上面的方式是采用了jdbc直接查询的方式,下面再看一下倘若采用mybatis如何获取到数据库的元信息。经过一些探索,发现我们并不能直接从mybatis中获取数据库的元数据信息,因此采用了拦截器的方式进行处理。
首先需要对于mybatis执行的结果集进行拦截:
@Intercepts({
@Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})})
public class ResultSetMetaDataInterceptor implements Interceptor {
同时,在拦截器中需要进行特殊的获取元数据的处理:
Object returnObject = invocation.proceed();
try {
if (returnObject instanceof List) {
List list = (List) returnObject;
if (list.isEmpty()) {
Statement stmt = (Statement) invocation.getArgs()[0];
ResultSetMetaData metaData = ((HikariProxyPreparedStatement) stmt).getMetaData();
如上所示,其实本质上与直接采用jdbc进行数据获取的方式是一样的,也就是在结果集处理时增加一步元数据的获取效果。下面来看一下拦截器的执行效果:
根据执行结果所示,我们已经成功的获取到元数据信息。
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。