Hibernate采用映射类型作为Java类型和SQL类型的桥梁,对应type属性。
分为两种:内置映射类型和客户化映射类型。
一、内置映射类型:
1、Java基本类型的Hibernate映射类型:
Java基础类型的Hibernate映射类型 | |||
Hibernate映射类型 | Java类型 | 标准SQL类型 | 大小和取值范围 |
integer或者int | int或者java.lang.Integer | INTEGER | |
long | long | BIGINT | |
short | short | SMALLINT | |
byte | byte | TINYINT | |
float | float | FLOAT | |
double | double | DOUBLE | |
character | char\String | CHAR(1) | 定长字符 |
string | String | VARCHAR | 边长字符串 |
boolean | boolean | BIT | |
yes_no | boolean | CHAR(1) | |
true_false | boolean | CHAR(1) |
2、Java时间和日期类型的Hibernate映射类型:
Java的时间日期类型的Hibernate映射类型 | |||
映射类型 | Java类型 | 标准SQL类型 | 描述 |
date | java.util.Date或者java.sql.Date | DATE | 代表日期 |
time | java.Util.Date或者java.sql.Time | TIME | 代表时间 |
timestamp | java.Util.Date或者java.sql.Timpstamp | TIMESTAMP | 代表时间和日期 |
calendar | java.Util.Calendar | TIMESTAMP | 同上 |
calendar_date | java.Util.Calendar | DATE | 代表日期 |
3、Java大对象类型的Hibernate映射类型:
Java大对象类型的Hibernate映射类型 | ||||
映射类型 | Java类型 | 标准SQL类型 | MySQL类型 | Oracle类型 |
binary | byte[] | VARBINARY(或者BLOB) | BLOB | BLOB |
text | java.lang.String | CLOB | TEXT | CLOB |
serializable | 实现Serializable接口的类 | VARBINARY(或者BLOB) | BLOB | BLOB |
clob | java.sql.Clob | CLOB | TEXT | CLOB |
blob | java.sql.Blob | BLOB | BLOB | BLOB |
4、JDK自带的个别Java类的Hibernate映射类型:
JDK自带的个别类的Hibernate映射类型 | ||
映射类型 | Java类型 | 标准SQL类型 |
class | java.lang.Class | VARCHAR |
locale | java.util.Locale | VARCHAR |
timezone | java.util.TimeZone | VARCHAR |
currency | java.util.Currency | VARCHAR |
二、客户化映射类型:
通过实现org.hibernate.usertype.UserType接口即可,实现的是将一个Java类型如何映射为SQL类型。
1、该接口的几个方法说明:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
2、配置文件使用:
?
1 |
|
3、使用该方式替代Hibernate组件:方法就是将多个SQL字段在接口实现中封装为Address对象。
4、实例代码:
public class AddressUserType implements UserType {private static final int[] SQL_TYPES = {Types.VARCHAR,Types.VARCHAR,Types.VARCHAR,Types.VARCHAR};
public int[] sqlTypes() { return SQL_TYPES; }
public Class returnedClass() { return Address.class; }
public boolean isMutable() { return false; }
public Object deepCopy(Object value) {
return value; // Address is immutable
}public boolean equals(Object x, Object y) {
if (x == y) return true;
if (x == null || y == null) return false;
return x.equals(y);
}public int hashCode(Object x){
return x.hashCode();
}public Object nullSafeGet(ResultSet resultSet,String[] names, Object owner)
throws HibernateException, SQLException {String province = resultSet.getString(names[0]);
String city = resultSet.getString(names[1]);
String street = resultSet.getString(names[2]);
String zipcode = resultSet.getString(names[3]);if(province ==null && city==null && street==null && zipcode==null)
return null;return new Address(province,city,street,zipcode);
}public void nullSafeSet(PreparedStatement statement,Object value,int index)
throws HibernateException, SQLException {if (value == null) {
statement.setNull(index, Types.VARCHAR);
statement.setNull(index+1, Types.VARCHAR);
statement.setNull(index+2, Types.VARCHAR);
statement.setNull(index+3, Types.VARCHAR);
} else {
Address address=(Address)value;
statement.setString(index, address.getProvince());
statement.setString(index+1, address.getCity());
statement.setString(index+2, address.getStreet());
statement.setString(index+3, address.getZipcode());
}
}public Object assemble(Serializable cached, Object owner){
return cached;
}public Serializable disassemble(Object value) {
return (Serializable)value;
}public Object replace(Object original,Object target,Object owner){
return original;
}
}
三、操纵Blob和Clob类型数据:
在持久化类中,二进制大对象可以声明为byte[]或者java.sql.Blob;字符串大对象可以声明为java.lang.String或者java.sql.Clob类型。
暂不解释。
(声明:该文所有内容均来自《精通Hibernate:Java对象持久化技术详解》[孙卫琴
电子工业出版社]
一书。该文的目的仅仅作为学习笔记。若需要转载,请注明原书相关信息。)
攻城狮在路上(壹) Hibernate(九)--- Hibernate的映射类型,布布扣,bubuko.com