属性值为空不更新到数据库工具类


最近项目用的hibernate,有通用得数据库操作类,但是由于tk得mybatis的工具类用习惯了,它有只更新不为null值的方法,但是为空串依然会更新,下面有设置空串为null的工具以及注解类

/**
 * @(#) BaseDao.java Created on 2010-5-17
 * 
 * Copyright (c) 2010 Aspire. All Rights Reserved
 */
package com.diandi.web.dao.impl;

import java.lang.reflect.Field;

import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Table;

import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Repository;

import com.diandi.annotation.Update;
import com.diandi.web.dao.IBaseDao;

/**
 * The class BaseDao
 * 
 * @author hejie
 * @version 1.0
 */
@Repository("baseDao")
public class BaseDao implements IBaseDao {
   

    /**
     * 

Title: updateByPrimaryKeySelective

*

Description: 字段值有则更新无则忽略 不支持对象嵌套 * @param entity * @author hejie*/ @Override public void updateByPrimaryKeySelective(Object entity) { try { Class<? extends Object> clazz = entity.getClass(); Table table = clazz.getAnnotation(Table.class); // 表名 String tableName = table.name(); StringBuilder sql = new StringBuilder("update " + tableName + " set "); StringBuilder param = new StringBuilder(); // 获取所有私有属性 Field[] dfields = clazz.getDeclaredFields(); // 获取有id注解的值 Object primaryKey = null; // 获取主键的字段名 String primaryKeyColumnName = null; for (Field f : dfields) { // 私有属性访问权限 f.setAccessible(true); // 判断是否存在id注解,不能更新主键 Id id = f.getAnnotation(Id.class); // 主键得操作 if(id != null){ primaryKey = f.get(entity); if(primaryKey == null){ throw new RuntimeException("主键为空,更新失败!"); } Column column = f.getAnnotation(Column.class); primaryKeyColumnName = column.name(); } // 非主键字段的操作 if(id == null){ Column column = f.getAnnotation(Column.class); JoinColumn joinColumn = f.getAnnotation(JoinColumn.class); if(column != null || joinColumn != null){ // 数据库字段名 String dbColumn = column != null ? column.name() : joinColumn.name(); Object object = null; // 获取对象得主键 if(joinColumn != null && f.get(entity) != null){ object = getPrimaryKey(f.get(entity)); }else{ object = f.get(entity); } // 先判断是否存在注解 Update update = f.getAnnotation(Update.class); if(update != null){ // 是否为true boolean isNull = update.isNullUpdate(); if(isNull){ // 字段值 if(object != null){ param.append(dbColumn + " = '" + object + "', "); }else{ param.append(dbColumn + " = " + null + ", "); } continue; } } // 字段值 if(object != null){ param.append(dbColumn + " = '" + object + "', "); } } } } // 再次判断主键名和值是否完整 if(primaryKey == null || StringUtils.isBlank(primaryKeyColumnName)){ throw new RuntimeException("主键为空,更新失败!"); } String updateSql = sql.append(param.substring(0,param.lastIndexOf(","))).toString() + " where " + primaryKeyColumnName + " = " + primaryKey; // entityMgr.createNativeQuery(updateSql).executeUpdate(); } catch (Exception e) { e.printStackTrace(); } } // 获取属性为对象得主键 public String getPrimaryKey(Object object){ try { Class<? extends Object> clazz = object.getClass(); Field[] dFields = clazz.getDeclaredFields(); for (Field f : dFields) { f.setAccessible(true); // 判断是否存在id注解,不能更新主键 Id id = f.getAnnotation(Id.class); // 主键得操作 if(id != null){ System.out.println(f.get(object)); return f.get(object) + ""; } } } catch (Exception e) { e.printStackTrace(); } return null; } }

设置属性值为空串的为null,或者直接在上面工具判断一下就好

package com.diandi.common.util;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName: CodeUtil  
 * @Description: 编码转换
 * @author 何杰  
 * @date 2020年5月27日  
 *
 */
public class ObjUtil {

    
    // 对象编码处理
    public static  T toUtf8(T t) {
        Class<? extends Object> clazz = t.getClass();
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            try {
                Class<?> type = field.getType();
                if(type.isAssignableFrom(String.class)){
                    String value = (String)field.get(t);
                    if(value != null){
                        field.set(t, new String(value.getBytes("ISO8859-1"),"UTF-8"));
                    }
                }
                field.get((Object)t);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return t;
    }
    
    
    // 对象转map
    public static Map objectToMap(Object obj) throws IllegalAccessException {
        Map map = new HashMap();
        Class<?> clazz = obj.getClass();
        for (Field field : clazz.getDeclaredFields()) {
            field.setAccessible(true);
            String fieldName = field.getName();
            if(!fieldName.equals("serialVersionUID")){
                String value = field.get(obj) + "";
                map.put(fieldName, value);
            }
        }
        return map;
    }
    
    /**
     * 设置空串为null
     */
    public static  T changeToNull(T o) {
        Class c = o.getClass();
        Class sc = c.getSuperclass();
        if (null != sc) {
            recursionNull(sc, o);
        }
        try {
            Field[] fs = c.getDeclaredFields();
            for (Field f : fs) {
                f.setAccessible(true);
                String st = f.get(o) + "";
                String str = st.replaceAll(" ", "");
                if (str.equals("") || str == null || str.equals("null")) {
                    f.set(o, null);
                }
            }
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return o;
    }

    /**
     * 判断是否有超类,若有则继续将超类的空值置空
     * 
     * @param sc
     * @param o
     * @return
     */
    public static  T recursionNull(Class sc, T o) {
        Class c = sc.getSuperclass();
        if (null != c) {
            recursionNull(c, o);
        }
        try {

            Field[] fs = sc.getDeclaredFields();
            for (Field f : fs) {
                f.setAccessible(true);
                String st = f.get(o) + "";
                String str = st.replaceAll(" ", "");
                if (str.equals("") || str == null || str.equals("null")) {
                    f.set(o, null);
                }
            }
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return o;
    }
    
}

 注解类:为什么要有这个呢,有些时候值为null也需要更新,在字段上加上该注解并设置值为null会对null值得属性进行拼接(本该设置默认值为true的,添加注解不用谢括号里的值就行,需要用的话可以改改)

package com.diandi.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.FIELD}) 
@Retention(RetentionPolicy.RUNTIME)
public @interface Update {

    /**
     * 为true时即使为null值也需要进行更新
     */
    boolean isNullUpdate() default false;
    
}