`
conkeyn
  • 浏览: 1529337 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

UserType 的 MapType,ListType

 
阅读更多
import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections.map.LinkedMap;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;

/**
 * @author linzq
 * 
 */
public class MapType implements UserType, Serializable {

    private static final long serialVersionUID = -8041009346154850427L;

    public MapType() {
        super();
    }

    public MapType(Map attributeMap) {
        super();
        this.attributeMap = attributeMap;
    }

    private Map attributeMap;

    public static final String SPLITTER = ";";

    public static final String SEPARATOR = ":";

    public static final String VALUE_BREAK = ",";

    public static final char BRACKET_LEFT = '{';

    public static final char BRACKET_RIGHT = '}';

    public static final int[] SQLTYPES = new int[] { Types.VARCHAR};

    public boolean isMutable() {
        return false;
    }

    public int[] sqlTypes() {
        return SQLTYPES;
    }

    public Object assemble(Serializable id, Object obj) throws HibernateException {
        return null;
    }

    /**
     * 将Map类型的属性拼接成字符串
     * 
     * @param attributeList
     * @return
     * @throws HibernateException
     */
    public Object assemble(Map attributeMap) throws HibernateException {
        if (attributeMap == null) {
            return null;
        }
        StringBuffer asbl = new StringBuffer();
        Iterator itr = attributeMap.keySet().iterator();
        String _key = null;
        while (itr.hasNext()) {
            _key = (String) itr.next();
            asbl.append(SPLITTER).append(BRACKET_LEFT).append(_key).append(SEPARATOR).append(attributeMap.get(_key)).append(BRACKET_RIGHT);
        }
        return asbl.toString().replaceFirst(SPLITTER, "");
    }

    /**
     * 自定义类型的完全复制方法,返回一个和原自定义数据相同的新对象
     * 
     * @param value
     *            the object to be cloned, which may be null
     * @return Object a copy
     * @see org.hibernate.usertype.UserType#deepCopy(java.lang.Object)
     */
    public Object deepCopy(Object value) throws HibernateException {
        if (value == null) {
            return null;
        }
        Map sourceMap = (Map) value;
        Map targetMap = new HashMap();
        targetMap.putAll(sourceMap);
        return targetMap;
    }

    /**
     * 自定义数据类型的比较方法
     * 
     * @param x
     * @param y
     * @return boolean
     * @see org.hibernate.usertype.UserType#equals(java.lang.Object,
     *      java.lang.Object)
     */
    public boolean equals(Object x, Object y) throws HibernateException {
        if (x == y) {
            return true;
        }
        if (x != null && y != null) {
            Map xMap = (Map) x;
            Map yMap = (Map) y;
            if (xMap.size() != yMap.size()) {
                return false;
            }
            List<String> _xList = new ArrayList(xMap.keySet());
            List<String> _yList = new ArrayList(xMap.keySet());
            Collections.sort(_xList);
            Collections.sort(_yList);
            for (int i = 0; i < xMap.size(); i++) {
                if (!_xList.get(i).equals(_yList.get(i))) {
                    return false;
                }
                if (!xMap.get(_xList.get(i)).equals(yMap.get(_yList.get(i)))) {
                    return false;
                }
            }
            return true;
        }
        return false;
    }

    public int hashCode(Object arg0) throws HibernateException {
        return attributeMap.hashCode();
    }

    /**
     * 将以格式为{key:value};{key:value1,value2}的字符串数组解析成一个Map
     * 
     * @param value
     * @return
     */
    public Map parse(String value) {
        if (value == null) {
            return null;
        }
        String[] strs = org.apache.commons.lang.StringUtils.split(value.trim(), SPLITTER);
        Map attributeMap = new LinkedMap();
        String _temp = null;
        for (int i = 0; i < strs.length; i++) {
            _temp = strs[i].substring(1, strs[i].length() - 1);
            attributeMap.put(_temp.split(SEPARATOR, 2)[0], _temp.split(SEPARATOR, 2)[1]);
        }
        return attributeMap;
    }

    /**
     * 从JDBC的ResultSet中读取数据,并将其转换为自定义类型后返回。 此方法要求对可能出现null的情况做处理。
     * names中包含了当前自定义类型的映射字段名称。
     * 
     * @param rs
     *            a JDBC result set
     * @param names
     *            the column names
     * @param owner
     *            the containing entity
     * @return Object
     * @throws HibernateException
     * @throws SQLException
     * @see org.hibernate.usertype.UserType#nullSafeGet(java.sql.ResultSet,
     *      java.lang.String[], java.lang.Object)
     */
    public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
        String value = (String) Hibernate.STRING.nullSafeGet(rs, names[0]);
        if (value != null) {
            attributeMap = parse(value);
            return attributeMap;
        }
        return null;
    }

    /**
     * 在Hibernate进行数据保存时被调用 可以通过PreparedStatement将自定义数据写入对应的数据库字段中
     * names中包含了当前自定义类型的映射字段名称。
     * 
     * @param st
     *            a JDBC prepared statement
     * @param value
     *            the object to write
     * @param index
     *            statement parameter index
     * @throws HibernateException
     * @throws SQLException
     * @see org.hibernate.usertype.UserType#nullSafeGet(java.sql.ResultSet,
     *      java.lang.String[], java.lang.Object)
     */
    public void nullSafeSet(PreparedStatement pst, Object value, int index) throws HibernateException, SQLException {
        if (value != null) {
            Hibernate.STRING.nullSafeSet(pst, assemble((Map) value), index);
        } else {
            Hibernate.STRING.nullSafeSet(pst, value, index);
        }
    }

    public Class returnedClass() {
        return MapType.class;
    }

    public Object replace(Object arg0, Object arg1, Object arg2) throws HibernateException {
        return null;
    }

    public Serializable disassemble(Object arg0) throws HibernateException {
        return null;
    }

    public Map getAttributeMap() {
        return attributeMap;
    }

    public void setAttributeMap(Map attributeMap) {
        this.attributeMap = attributeMap;
    }
}

 

import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;

public class ListType implements UserType {

	private static final String SPLITTER = ";";

	private static final int[] TYPES = new int[] { Types.VARCHAR };

	
	public Object assemble(Serializable serializable, Object object)
			throws HibernateException {
		return deepCopy(serializable);
	}

	
	public Object deepCopy(Object object) throws HibernateException {
		List sourceSet = (List) object;
		List targetSet = new ArrayList();
		if (sourceSet != null) {
			targetSet.addAll(sourceSet);
		}
		return targetSet;
	}

	
	public Serializable disassemble(Object object) throws HibernateException {
		return (Serializable) deepCopy(object);
	}

	
	public boolean equals(Object one, Object other) throws HibernateException {
		if (one == other) {// 如果两个对象的指针是指向同一位置。
			return true;
		}
		if (one != null && other != null) {
			List set0 = (List) one;
			List set1 = (List) other;
			if (set0.size() != set1.size()) {// 如果列表的长度不相等
				return false;
			}
			Object[] s0 = set0.toArray();
			Object[] s1 = set1.toArray();
			if (s0.length != s1.length) {// 如果列表的长度不相等
				return false;
			}
			for (int i = 0; i < s0.length; i++) {
				Object id0 = s0[i];
				Object id1 = s1[i];
				if (!id0.equals(id1)) {// 如果在列表中相同位置上的对象不相等
					return false;
				}
			}
			return true;
		}
		return false;
	}

	
	public int hashCode(Object object) throws HibernateException {
		List s = (List) object;
		return s.hashCode();
	}

	
	public boolean isMutable() {
		return false;
	}

	
	public Object nullSafeGet(ResultSet resultSet, String[] stringArray,
			Object object) throws HibernateException, SQLException {
		String value = (String) Hibernate.STRING.nullSafeGet(resultSet,
				stringArray[0]);
		if (value != null) {
			return parse(value);
		} else {
			return new ArrayList();
		}
	}

	private List parse(String value) {
		String[] strs = StringUtils.split(value, SPLITTER);
		List set = new ArrayList();
		for (int i = 0; i < strs.length; i++) {
			if (StringUtils.isNotBlank(strs[i])) {
				set.add(strs[i]);
				// set.add(new Long(Long.parseLong(strs[i])));
			}
		}
		return set;
	}

	
	public void nullSafeSet(PreparedStatement preparedStatement, Object object,
			int _int) throws HibernateException, SQLException {
		if (object != null) {
			String str = assemble((List) object);
			Hibernate.STRING.nullSafeSet(preparedStatement, str, _int);
		} else {
			Hibernate.STRING.nullSafeSet(preparedStatement, "", _int);
		}
	}

	private String assemble(List set) {
		StringBuffer sb = new StringBuffer();
		Iterator it = set.iterator();
		while (it.hasNext()) {
			sb.append(it.next());
			sb.append(SPLITTER);
		}
		String fs = sb.toString();
		if (fs != null && fs.length() > 0 && fs.endsWith(SPLITTER)) {
			fs = fs.substring(0, fs.length() - 1);
		}
		return fs;
	}

	
	public Object replace(Object object, Object object1, Object object2)
			throws HibernateException {
		return object;
	}

	
	public Class returnedClass() {
		return List.class;
	}

	
	public int[] sqlTypes() {
		return TYPES;
	}
}
 

d

分享到:
评论

相关推荐

    VC开发工具使用技巧源代码_usertype.zip

    VC开发工具使用技巧源代码_usertype.zipVC开发工具使用技巧源代码_usertype.zipVC开发工具使用技巧源代码_usertype.zipVC开发工具使用技巧源代码_usertype.zipVC开发工具使用技巧源代码_usertype.zip

    CUDA SDK 语法高亮必备 usertype.dat

    在VS中配置CUDA时,本身是不识别CUDA关键字的,关键字不能高亮。早期的CUDA版本在SDK中提供了usertype.dat,其中包含CUDA的关键字,但后来的CUDA没有这个文件,网上找了好久,现在贴出来亲测可用~

    usertype.dat

    HLSL的关键字,放在vs的IDE文件下,以在vs中高亮HLSL的关键字

    VS2005编辑器支持着色器语法高亮,一个完整的usertype.dat

    1. 创建或编辑usertype.dat文件(此文件在VS安装目录下的Common7\IDE下面,比如我的就在D:\Program Files\Microsoft Visual Studio 8\Common7\IDE\usertype.dat),添加如下的关键字列表,每个单词占一行,如果你想...

    商业编程-源码-VC开发工具使用技巧源代码 usertype.zip

    本资源“商业编程-源码-VC开发工具使用技巧源代码 usertype.zip”包含了一组与VC开发相关的源代码,旨在帮助开发者深入理解和掌握VC开发工具的实用技巧。 1. **VC开发环境设置**:VC不仅仅是一个编译器,它还包括一...

    枚举类型在switch语句中的用法

    UserType type = UserType.valueOf(userType); switch (type) { case STUDENT: // 学生相关的处理逻辑 break; case TEACHER: // 教师相关的处理逻辑 break; case PARENT: // 家长相关的处理逻辑 break; ...

    网页短视频管理系统,框架 vs2019 + asp.net webform + sql server

    网页短视频管理系统 框架 vs2019 + asp.net webform + sql server 注意sql server类和access数据库可以使用vs自带的数据库启动,不需要安装庞大的sql安装包。...Id UserName PW Sex Explian UserType

    网页短视频播客视频管理系统,框架 vs2019 + asp.net webform + sql server

    网页短视频播客视频管理系统框架 vs2019 + asp.net webform + sql server 注意sql server类和access数据库可以使用vs自带的数据库启动,不需要安装庞大的sql安装包。...Id UserName PW Sex Explian UserType

    BaiduNetdisk_mac_3.4.1.dmg

    百度网盘mac

    动态添加hibernate domain的属性的例子

    这通常通过实现`org.hibernate.usertype.UserType`接口来完成,该接口定义了将Java类型转换为数据库类型的逻辑。 以下是一些关键步骤: 1. **创建动态扩展的基类**:定义一个基类,它继承自Hibernate的`...

    J2EE企业级项目开发-1期 04 Hibernate使用经验.doc

    3. **自定义UserType实例**:例如,如果我们需要在`TUSER`表中存储用户的电子邮件,但不想为每个邮箱创建单独的记录,可以使用`UserType`将多个邮箱地址存储在一个`VARCHAR`字段内,以分号分隔。自定义的`Email`类...

    SQL进行数据定义查询

    例如,创建一个名为`PersonalInfo`的表,包含`Region`、`UserType`、`Income`等字段: ```sql CREATE TABLE PersonalInfo ( ID INT PRIMARY KEY, Region NVARCHAR(50), UserType NVARCHAR(50), Income DECIMAL...

    qt自定义类型 Q_DECLARE_METATYPE与qRegisterMetaType

    如果要使自定义类型或其他非QMetaType内置类型在QVaiant中使用,必须使用该宏Q_DECLARE_METATYPE。 该类型必须有公有的 构造、析构、复制构造 函数 qRegisterMetaType 必须使用该函数的两种情况:1、如果非QMetaType...

    PyQt(Python+Qt)学习随笔:枚举类QTreeWidgetItem.ItemType、QListWidgetItem.ItemType的取值及含义

    当需要创建自定义项以实现特定功能时,开发者可以使用大于等于`QTreeWidgetItem.UserType`或`QListWidgetItem.UserType`的枚举值。这两个枚举值等于整数1000,它们提供了一个范围,使得开发者可以在1000及其以上设置...

    benderco-angular-atm:https:github.combenderCOangular-atm

    UserType.basic 1000000 abc123! UserType.basic 2000 abc123! UserType.admin 1000000000 abc123! UserType.admin 500000 abc123! UserType.super 250000 abc123! UserType.super 6500000 ...

    sql语句替换某列所有字段中的某个字符(如替换‘1,2,3,4’中的4)

    UPDATE users SET usertype = REPLACE(CAST(usertype AS VARCHAR(255)), '4', '3'); ``` 这里的`CAST()`函数用于将`usertype`列中的数据类型转换为VARCHAR(255),确保REPLACE函数可以正确处理字符串。需要注意的是...

    Log_Encapsulation_demo.rar

    在IT行业中,日志记录是程序调试、性能分析和故障排查的重要工具。在这个"Log_Encapsulation_demo"项目中,开发者采用C++编程语言,利用fstream、ofstream和ifstream库来实现了一个高效且灵活的日志操作类。...

    RESTEasy入门经典.docx

    这将生成`UserType`和`ObjectFactory`等类,`UserType`代表XML中的`&lt;user&gt;`元素,可以直接在Java代码中使用。 RESTEasy与JAXB(Java Architecture for XML Binding)紧密集成,JAXB允许你将XML文档与Java对象互相...

    hibernate映射Oracle中LONG类型

    这些方法都是 UserType 接口的必备方法,其中 nullSafeGet 方法用于从 ResultSet 中获取 LONG 类型字段的值,而 deepCopy 方法用于深度拷贝 LONG 类型字段的值。 在 Hibernate 框架中,我们可以使用自定义类型来...

    有安全需求的选题系统

    2:访问控制:不同类型的user,其权限由usertype规定 3:建立视图用了安全读取数据库中的数据: create view tb_userview as select usernc,usertype,userpwd from tb_user create view tb_userncview as select id,...

Global site tag (gtag.js) - Google Analytics