MySQL中的DateTime数据利用反射赋值给pojo中类的对应属性
一、问题导入
-
项目要求
在MySQL数据库中的topic数据表中,有一个字段的数据类型是datetime,通过反射要将该字段数据赋值给pojo文件夹内Topic类中的topicDate属性,其数据类型为java.util.Date
-
出现过的错误
/* 1.获取字段值后,就直接赋值给对应的属性。 原因是:conlumnValue也是Date类型,但是其内部的值的形式是“2021-01-23T14:23:56” */ for (int i = 0; i < columnCount; i++) { // 4.4.3 通过结果集对象获取该字段的值 Object columnValue = rs.getObject(i + 1); field.setAccessible(true); // t是泛型实例对象,给该字段对应的属性赋值 field.set(t,columnValue); }
-
错误报文
java.lang.IllegalArgumentException: Can not set java.util.Date field com.atguigu.qqzone.pojo.Topic.topicDate to null value
-
试错经过
看了很多博文,尝试着使用new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”).parse( )/format( ) 对columnValue进行转型,结果都失败。
使用Debug调式,都是显示columnValue的值为“2021-01-23T14:23:56”,中间那个**“ T ”**怎么都去不掉
-
正解
从rs(结果集)处开始类型转换
-
解决思路
困扰了一天的问题,最终解决,有时问题出现,如果在这个点上解决不了,可以试着向上推一层
二、解决方式
-
pojo中的类
package com.atguigu.qqzone.pojo; import java.util.Date; public class Topic { private Integer id; private String title; private String content; private Date topicDate; private UserBasic author; // 及相应的set/get方法 }
-
BaseDAO类
public abstract class BaseDAO<T> { private Class<T> clazz = null; private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); public List<T> CommonRetrieve(Connection conn, String sql, Object...args) { PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(sql); for (int i = 0; i < args.length; i++) { ps.setObject(i+1,args[i]); } rs = ps.executeQuery(); ResultSetMetaData rsmd = rs.getMetaData(); int columnCount = rsmd.getColumnCount(); ArrayList<T> tSet = new ArrayList<>(); while (rs.next()) { T t = clazz.newInstance(); for (int i = 0; i < columnCount; i++) { Object columnValue = rs.getObject(i + 1); String columnLabel = rsmd.getColumnLabel(i+1); Field field = clazz.getDeclaredField(columnLabel); String typeName = field.getType().getName(); // 1.判断该字段对应属性类型是否为Date类型 if (DateUtil.isDateTime(typeName)) { // 2.再次使用结果集rs,直接获取为Timestamp时间类型 Timestamp timestamp = rs.getTimestamp(i+1); // 3.使用SimpleDateFormat,将其格式化为字符串 String format1 = format.format(timestamp.getTime()); // 4.再将该字符串解析为java.util.Date类型,最后赋值给columnValue columnValue = format.parse(format1); } // 确保私有属性可以访问 field.setAccessible(true); // 统一将获取的各字段的值,赋值给该字段对应的属性 field.set(t,columnValue); } tSet.add(t); } return tSet; } catch (Exception e) { e.printStackTrace(); } return null; } }
-
在页面中显示正常时间的两种方式
在pojo中的get方法中转变格式
public String getTopicDate() { return dateFormat.format(topicDate); }
在Html页面上使用thymeleaf中的dates
<td th:text="${#dates.format(topic.topicDate,'yyyy-MM-dd HH:mm:ss')}"></td>