Flink环境中,实现:在MySQL中查询一张表的所有数据,把查询的数据封装到List集合,得到全是null值

  • Post author:
  • Post category:mysql


Flink环境中,实现:在MySQL中查询一张表的所有数据,把查询的数据封装到List集合中。代码如下:

List<TableProcess> list = queryList(getMySQLConnection(), "select * from gmall_config.table_process", TableProcess.class,true);
for (TableProcess object : list) {
    System.out.println(object);
}

现象:得不到对象的数据,全是null值

在这里插入图片描述
原因:由于MySQL中的列名是使用下划线命名法,而java中使用驼峰命名,列名对不上,写不进去

解决办法:使用到了一个 commons-beanutils 工具类

//默认下划线不转驼峰
boolean flag = false;
if (isToCamel.length>0) {//如果有传入,则应用传入的值
    flag = isToCamel[0];
}

//执行sql语句,将查询的结果封装到List集合
ArrayList<T> list = new ArrayList<>();

//预处理
//在try中执行ps,会自动关闭ps,无需我们动手
try(  PreparedStatement ps = conn.prepareStatement(querySQL)) {

    //执行sql
    ResultSet resultSet = ps.executeQuery();
    //获取每一行有多少列
    ResultSetMetaData metaData = resultSet.getMetaData();
    //将结果封装到sql
    while (resultSet.next()) {
      //表示遍历到了一行
        //这一行有很多的列,把每行数据封装到一个对象T中,每列就是T中的一个属性
        T t = tClass.newInstance();//调用无参构造器创建对象
        //在java中,只要创建对象,就一定调用了构造器,
        //每一行有多少行?
        for (int i = 1; i <= metaData.getColumnCount(); i++) {
            //列名:T的属性名
            //列值:T的属性值
            //getColumnName:获取的是原始列名,getColumnLabel获取更新后的列名
            String name = metaData.getColumnLabel(i);
            if (flag) {
                //把name转成驼峰命名
                //a_b aB
                 name = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, name);
            }
            Object obj = resultSet.getObject(i);

            BeanUtils.setProperty(t,name,obj);
        }

        list.add(t);
    }



版权声明:本文为m0_37759590原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。