构造方法的作用就是初始化类中的数据成员和静态变量已经静态成员,在构造函数中必须对类中的数据成员进行初始化生产对应的类对象然后在使用数据成员的过程中才能使用它所提供的方法(服务)
构造方法是不能被继承的无法设置默认值
Spring框架可以避免在构造方法中初始化数据成员类对象,采用依赖注入的方法,由IOC容器完成对依赖对象的注入,在需要时可以随时使用数据成员提供的方法(服务)
构造方法注入可以把对特定接口的不同实现类的对象注入同一个被注入对象中,这样就可以实现被注入对象的重用,可以根据不同的接口实现重用相同的逻辑(被注入类)类似于多个子类对象被调用父类对象的方法调用一样。
接口中的方法默认是public abstract 变量默认是public static final类型的,所以在接口中可以省略对方法类型的声明,采用默认类型。
Hibernate中的UserType接口和CompositeUserType接口的使用规则:
1,:在*.hbm.xm.配置文件中在属性的定义条目中即对象关系映射的配置中type=“”描述的是对象的属性和数据库表的字段之间的映射类型,既不是对象的属性类型,也不是数据库表的字段的类型是or映射出的一种hibernate支持的中间层数据类型-----持久化层的数据类型或者称为hibernate的数据类型。
UserType接口是hibernate中提供的一种hibernate数据类型自定义接口,可以通过实现其接口来自定义hibernate数据类型,通过hibernate自定义数据类型可以把数据库中不存在的但却又需要来和实体类中 的属性类型相对应的类型建立一种间接的映射,避免了在业务逻辑中需要处理数据逻辑的情况,使得程序更加的松散。CompositeUserType是继承了UserType类的接口包括父类的所有方法和新增功能。
UserType类是使用方法如下:
实体类Tusers:
package com.inspur.po;
import java.util.List;
public class Tusers {
private Integer id;
private String name;
private Integer age;
private List email;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public List getEmail() {
return email;
}
public void setEmail(List email) {
this.email = email;
}
public Tusers(Integer id, String name, Integer age, List email) {
this.id = id;
this.name = name;
this.age = age;
this.email = email;
}
public Tusers(){}
}
实体类对应的hbm.xml文件配置信息:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.inspur.po.Tusers" table="t_user" catalog="sample">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="50" />
</property>
<property name="age" type="java.lang.Integer">
<column name="age" />
</property>
<property name="email" type="com.inspur.usertype.EmailList">
<column name="email" length="300" />
</property>
</class>
</hibernate-mapping>
自定义hibernate数据类型实现如下:
package com.inspur.usertype;
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.List;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;
import antlr.StringUtils;
public class EmailList implements UserType{
private List emails;
private static final String SPLITTER=";";//char类型的变量必须使用单引号赋值;
public static final int[] TYPES=new int[]{Types.VARCHAR};
@Override
public Object assemble(Serializable arg0, Object arg1)
throws HibernateException {
// TODO Auto-generated method stub
return null;
}
//assemble函数的重载
public String assemble(List emailList){
StringBuffer strBuf=new StringBuffer();
for(int i=0;i<emailList.size()-1;i++){
strBuf.append(emailList.get(i)).append(SPLITTER);
}
strBuf.append(emailList.get(emailList.size()-1));
return strBuf.toString();
}
public List parse(String value){
String[] str=value.split(SPLITTER);
List emailList=new ArrayList();
for(int i=0;i<str.length;i++){
emailList.add(str[i]);
}
return emailList;
}
@Override
public Object deepCopy(Object value) throws HibernateException {
// TODO Auto-generated method stub
List sourceList=(List)value;
List targetList=new ArrayList();
targetList.addAll(sourceList);
return targetList;
}
@Override
public Serializable disassemble(Object arg0) throws HibernateException {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean equals(Object objectx, Object objecty) throws HibernateException {
// TODO Auto-generated method stub
if(objectx==objecty){
return true;
}
if(objectx!=null&&objecty!=null){
List x=(List)objectx;
List y=(List)objecty;
if(x.size()!=y.size()){
return false;
}
for(int i=0;i<x.size();i++){
String str1=(String)x.get(i);
String str2=(String)y.get(i);
if(!str1.equals(str2)){
return false;
}
}
return true;
}
return false;
}
@Override
public int hashCode(Object arg0) throws HibernateException {
// TODO Auto-generated method stub
return 0;
}
@Override
//本实例类型是否可变
public boolean isMutable() {
// TODO Auto-generated method stub
return false;
}
@Override
//从结果集读取数据,将其 转化为自定义类型后返回
//name 当前自定义类型的映射字段名称
public Object nullSafeGet(ResultSet rs, String[] name, Object ower)
throws HibernateException, SQLException {
// TODO Auto-generated method stub
String value=(String)Hibernate.STRING.nullSafeGet(rs, name[0]);
if(value!=null){
return parse(value);
}else{
return null;
}
}
@Override
public void nullSafeSet(PreparedStatement st, Object value, int index)
throws HibernateException, SQLException {
// TODO Auto-generated method stub
if(value!=null){
String str=assemble((List)value);
Hibernate.STRING.nullSafeSet(st, str, index);
}else
{
Hibernate.STRING.nullSafeSet(st, value, index);
}
}
@Override
public Object replace(Object arg0, Object arg1, Object arg2)
throws HibernateException {
// TODO Auto-generated method stub
return null;
}
@Override
public Class returnedClass() {
// TODO Auto-generated method stub
return List.class;
}
@Override
//返回所映射字段的SQL类型
public int[] sqlTypes() {
// TODO Auto-generated method stub
return TYPES;
}
}
Hibernate.cfg.xml文件配置信息:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/sample
</property>
<property name="connection.username">root</property>
<property name="connection.password">815211lzhq</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="myeclipse.connection.profile">
mysql_driver
</property>
<property name="show_sql">true</property>
<mapping resource="com/inspur/po/TUser.hbm.xml" />
</session-factory>
</hibernate-configuration>
测试类代码:
package com.inspur.test;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.inspur.po.Tusers;
import junit.framework.TestCase;
public class ListTest extends TestCase {
Session session=null;
@Override
protected void setUp() throws Exception {
Configuration config=new Configuration().configure();
SessionFactory sessionFactory=config.buildSessionFactory();
session=sessionFactory.openSession();
}
@Override
protected void tearDown() throws Exception {
session.close();
}
public void testLoad(){
Tusers user=(Tusers) session.load(Tusers.class, new Integer(1));
List list=user.getEmail();//list是指向user对象属性域的指针,所有对list的修改都是对user对象的修改。
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
list.add("liuzhq@inspurworld.com");
Transaction tran=session.beginTransaction();
session.save(user);
tran.commit();
}
}
通过使用自定义数据类型,避免 了从数据库中获得数据时仍然需要在业务逻辑中处理string字符串中的以分号分隔的多个邮箱地址,这样可以使业务逻辑只处理简单的list类型数据就可以,不用再考虑数据访问逻辑,成功实现代码的解耦。这种设计模式应该在以后的使用过程中抽象成一种工具类设计模式。