1. 程式人生 > 其它 >java用反射實現動態RowMapper

java用反射實現動態RowMapper

jdbcTemplate查詢返回物件的時候,可以自定義rowmapper,也有一個BeanPropertyRowMapper可以用,但要求類屬性和表字段嚴格對應;

如果我們的表字段跟類不能嚴格對應,這個時候只能寫RowMapper,但又不想一個一個寫,怎麼辦?

我們可以通過反射,來動態實現RowMapper

大家可以看到我這個model類,屬性和表裡的欄位是無法對映的,這個時候BeanPropertyRowMapper排不上用場。

只能自定義了

@Table(name = "table_name")
public class TableClass implements Serializable {
    
private static final long serialVersionUID = -7355355251303268193L; @Column(name="bizmonth") private String bizMonth; @Column(name="complete_num_1m") private Long completeNum; @Column(name="uncomplete_num_1m") private Long unCompleteNum; @Column(name
="total_num_1m") private Long totalNum; }

反射獲取RowMapper

/**
     * 查詢表column對應的類field
     * @param clazz
     * @return
     */
    public static Map<String, Field> getColumnMap(Class<?> clazz) {
        Map<String, Field> map = new HashMap<>();
        Field[] declaredFields 
= clazz.getDeclaredFields(); for (Field declaredField : declaredFields) { String fieldName = declaredField.getName(); if (!fieldName.equals("serialVersionUID")) { if (declaredField.isAnnotationPresent(Column.class)) { Column fieldAnnotation = declaredField.getAnnotation(Column.class); String columnName = fieldAnnotation.name(); map.put(columnName, declaredField); } else { throw new NullPointerException("欄位缺少Column註解"); } } } return map; } /** * 獲取一個類的RowMapper */ public static <T> RowMapper<T> getRowMapper(Class<T> clazz) { Map<String, Field> columnMap = getColumnMap(clazz); RowMapper<T> rowMapper = new RowMapper<T>() { @Override public T mapRow(ResultSet rs, int i) throws SQLException { try { T t = clazz.newInstance(); for (Map.Entry<String, Field> entry : columnMap.entrySet()) { String columnName = entry.getKey(); Field field = entry.getValue(); field.setAccessible(true); Object columnVal = rs.getObject(columnName); field.set(t, columnVal); } return t; } catch (InstantiationException | IllegalAccessException e) { e.printStackTrace(); } return null; } }; return rowMapper; }

大功告成!