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


    最近项目用的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 <code>BaseDao</code>
     * 
     * @author hejie
     * @version 1.0
     */
    @Repository("baseDao")
    public class BaseDao implements IBaseDao {
       
    
        /**
         * <p>Title: updateByPrimaryKeySelective</p>  
         * <p>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> 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<String, String> objectToMap(Object obj) throws IllegalAccessException {
            Map<String, String> map = new HashMap<String,String>();
            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> 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> 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;
        
    }
  • 相关阅读:
    Python Requests-学习笔记(9)-错误与异常
    .NET C# 创建WebService服务简单的例子
    10个免费开源的JS音乐播放器插件
    7款高颜值HTML5播放器:让你的音乐有声有色
    Asp.net基于session实现购物车的方法
    ASP.NET用GridView控件实现购物车功能
    jquery鼠标跟随流体吸引特效
    jquery鼠标跟随特效
    JQUERY互动星空粒子背景效果
    jQuery插件库常用前端库引用地址
  • 原文地址:https://www.cnblogs.com/hjieone/p/13253140.html
Copyright © 2020-2023  润新知