JdbcTemplate实体映射

摘要:
JdbcTemplate实体映射如果您需要使用Jdbc模板将查询的数据映射到JavaPOJO,那么本文适合您。以下是将表中的一行记录映射到Map的示例,默认情况下,这也是JdbcTemplate提供的函数。Listresult=jdbcTemplate.queryForList;User中的属性与字段一一对应,下划线可以自动转换为驼峰。以下是一个实现:publicfinalclassCamelCaseUtils{privatestaticfinalcharSEPARATOR='_';privateCamelCaseUs(){}publicstaticStringtoCamelCase{if{return null;}input=input。至小写();intlength=input.length();StringBuildersb=newStringBuilder;booleanupperCase=false;对于{charc=input.charAt;如果{upperCase=true;}elseif{sb.append;upperCase=false;}否则{sb.eppend;}}returnsb.toString();}然后,您可以很高兴地映射到POJO:Listresult=queryForList(“select.id,t.name,t.age,t.mobile_phonefromtbtwohere.id˂?
JdbcTemplate实体映射

如果你需要使用JdbcTemplate将查询的数据映射成Java POJO,那么这篇文章适合你。

一个例子入门

下面是一个将表中一行记录映射成Map的例子,也是JdbcTemplate默认提供的功能。

List<Map<String, Object>> result = jdbcTemplate.queryForList("select id, name, age from tbl");

然而,我们更希望得到的是下面这样的。

List<User> result = jdbcTemplate.queryForList("select id, name, age from tbl", User.class);

其中User中的属性与字段一一对应,还能自动将下划线转成驼峰。

开始

实现思路是通过反射将字段映射到对象对应的属性。

核心代码

public <T> List<T> queryForList(String sql, Class<T> clazz, Object... params) {
        final List<T> result = new ArrayList<>();
        jdbcTemplate.query(sql, params, rs -> {
            try {
                // 字段名称
                List<String> columnNames = new ArrayList<>();
                ResultSetMetaData meta = rs.getMetaData();
                int num = meta.getColumnCount();
                for (int i = 0; i < num; i++) {
                    columnNames.add(meta.getColumnLabel(i + 1));
                }
                // 设置值
                do {
                    T obj = clazz.getConstructor().newInstance();
                    for (int i = 0; i < num; i++) {
                        // 获取值
                        Object value = rs.getObject(i + 1);
                        // table.column形式的字段去掉前缀table.
                        String columnName = resolveColumn(columnNames.get(i));
                        // 下划线转驼峰
                        String property = CamelCaseUtils.toCamelCase(columnName);
                        // 复制值到属性,这是spring的工具类
                        BeanUtils.copyProperty(obj, property, value);
                    }
                    result.add(obj);
                } while (rs.next());
            } catch (Exception e) {
                throw new QueryException(e);
            }
        });
        if (CollectionUtils.isEmpty(result)) {
            return Collections.emptyList();
        }
        return result;
    }

注意:

  • String columnName = resolveColumn(columnNames.get(i))用来去掉字段的表前缀,比如t.id替换成id
  • String property = CamelCaseUtils.toCamelCase(columnName)用来将字段的下划线转成属性的驼峰形式,比如page_view转换成pageView
  • BeanUtils.copyProperty(obj, property, value)是用来复制值到对象的属性中,BeanUtils是spring的工具类,经常会使用到

下面是两个工具方法或类。

去掉表前缀

之所以去掉表前缀,是为了避免在SQL中使用别名,导致SQL过长。

private String resolveColumn(String column) {
    final int notExistIndex = -1;
    int index = column.indexOf(".");
    if (index == notExistIndex) {
        return column;
    }
    return column.substring(index + 1);
}

字段下划线转成属性的驼峰

当然,下划线转驼峰有很多更好的实现,这里不限制。如下是一个实现:

public final class CamelCaseUtils {

    private static final char SEPARATOR = '_';

    private CamelCaseUtils() {
    }

    public static String toCamelCase(String input) {
        if (input == null) {
            return null;
        }
        input = input.toLowerCase();
        int length = input.length();

        StringBuilder sb = new StringBuilder(length);
        boolean upperCase = false;
        for (int i = 0; i < length; i++) {
            char c = input.charAt(i);
            if (c == SEPARATOR) {
                upperCase = true;
            } else if (upperCase) {
                sb.append(Character.toUpperCase(c));
                upperCase = false;
            } else {
                sb.append(c);
            }
        }

        return sb.toString();
    }

}

使用

接下来就可以愉快的映射成POJO了:

List<User> result = queryForList("select t.id, t.name, t.age, t.mobile_phone from tbl t where t.id < ?", User.class, 100L);

如果参数比较多,还是通过数组传入:

List<User> result = queryForList("select t.id, t.name, t.age, t.mobile_phone from tbl t where t.id < ?", User.class, new Object[]{100L});

下面定义POJO:

public class User implements Serializabl {
    
    private Long id;

    private String name;

    private Integer age;

    private String mobilePhone;

    // 省略到getters、setters
}

补充

映射成一个值

在count时,我们是希望返回一个值的,接下来是将结果映射成一个值。

public <T> T queryOneColumn(String sql, Class<T> clazz, Object... params) {
    T result;
    if (ArrayUtils.isEmpty(params)) {
        result = jdbcTemplate.queryForObject(sql, clazz);
    } else {
        result = jdbcTemplate.queryForObject(sql, params, clazz);
    }
    return result;
}

使用:

long total = queryOneColumn("select count(1) from tbl", Long.class);

免责声明:文章转载自《JdbcTemplate实体映射》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇硬盘杀手!Windows版Redis疯狂占用C盘空间!说说WeakReference弱引用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

学习Spring Boot:(二十四)多数据源配置与使用

前言 随着业务量增大,可能有些业务不是放在同一个数据库中,所以系统有需求使用多个数据库完成业务需求,我们需要配置多个数据源,从而进行操作不同数据库中数据。 正文 JdbcTemplate 多数据源 配置 需要在 Spring Boot 中配置多个数据库连接,当然怎么设置连接参数的 key 可以自己决定, 需要注意的是 Spring Boot 2.0 的默...

SpringBoot 数据篇之使用JDBC

SpringBootTutorial :: Data :: Jdbc 简介 API execute update query 实战 配置数据源 完整示例 引申和引用 简介 Spring Data 包含对 JDBC 的存储库支持,并将自动为 CrudRepository 上的方法生成 SQL。对于更高级的查询,提供了 @Query 注解。 当...

Spring 中使用了哪些设计模式?

好了,话不多说,开始今天的内容。spring中常用的设计模式达到九种,我们举例说明。 1、简单工厂模式 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。  简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。  spring中的BeanFactory就是简单工厂模式的体现,根据...

jdbcTemplate 获取数据表结构

jdbcTemplate 操作方法  Java代码   /**  *1.方法一:  */   String sql = "select * from "+ tableName;   //RowCountCallbackHandler rcch = new RowCountCallbackHandler();   //this.jdbcTemplate...

SpringBoot整合达梦数据库

安装配置 软件安装 下载地址:https://www.dameng.com/view_61.html 本文以x86 win64 DM8为例 安装完毕后打开DM数据库配置助手创建数据库,设置字符集utf8,去除字符大小写敏感 创建表空间及用户,最好是一个库对应一个用户一个表空间,创建用户时需要指定对应表空间 需要对用户分配DBA操作权限 数据表迁移...

SpringBoot初学(4)– JdbcTemplate和Mybatis

前言 github: https://github.com/vergilyn/SpringBootDemo 代码位置: 一、Spring Boot集成JdbcTemplate或NamedParameterJdbcTemplate spring boot中JdbcTemplate与NamedParameterJdbcTemplate都是被自动配置的...