SSH通过xml格式进行表数据初始化的添加

Service业务接口类:

package com.han.service;
/**
 * @author hanwei
 * @date:2016-8-24 上午10:05:03
 */
public interface InitService extends GenericServ {
	/**
	 * 通过xml初始化数据
	 * @param fileName
	 */
	public void addInitEntityByXml(String fileName);
}

Service业务接口实现类:

package com.han.service.impl;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;

import javax.inject.Inject;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.stereotype.Service;

import com.han.dao.impl.GenericDaoImpl;
import com.han.error.GlobalException;
import com.han.service.InitService;
import com.sun.org.apache.commons.beanutils.BeanUtils;

/**
 * @author hanwei
 * @date:2016-8-24 上午10:05:31
 */
@Service("initService")
public class InitServiceImpl extends GenericDaoImpl implements InitService {
	// 注入Spring工厂用于加载实体类
	@Inject
	private BeanFactory beanFactory;

	/**
	 * 获得初始化xml文件数据对象Document
	 * @param fileName 文件名称
	 * @return
	 */
	private Document readDocument(String fileName) {
		Document document = null;
		SAXReader saxReader = null;
		try {
			// 创建xml解析对象
			saxReader = new SAXReader();
			// 获取文件路劲 该init.xml文件放在WebRoot/init/init.xml
			String filePath = InitServiceImpl.class.getClassLoader().getResource("").toString().replace("WEB-INF/classes/", "");
			document = saxReader.read(filePath + "init/init.xml");
		} catch (DocumentException e) {
			e.printStackTrace();
		}
		return document;
	}

	/**
	 * 解析XMl文件进行数据的添加处理
	 * @param fileName 文件名称
	 */
	@Override
	public void addInitEntityByXml(String fileName) {
		Document readDocument = this.readDocument(fileName);
		Element root = null;
		try {
			if (readDocument != null) {
				// 获取根元素
				root = readDocument.getRootElement();
				// 获取包名
				String pname = root.attributeValue("package");
				// 根据当前元素节点进行寻找
				@SuppressWarnings("unchecked")
				List<Element> initEntitys = (List<Element>) root.selectNodes("/entitys/initEntity");
				for (Element e : initEntitys) {
					// 判断该实体是否存在 0:不存在进行添加 1:存在排除
					if (e.attributeValue("exist") == "1") {
						continue;
					} else {
						// 获取类名
						String cname = e.attributeValue("class");
						cname = pname + "." + cname;
						// 获取方法
						String method = e.attributeValue("method");
						// 获取所有的添加的实体
						@SuppressWarnings("unchecked")
						List<Element> entitys = (List<Element>) e.selectNodes("entity");
						addElements(cname, method, entitys);
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 解析出每个元素节点的数据进行添加
	 * @param cname 包名.类名 com.han.model.OrgType
	 * @param method 方法名 <initEntity exist="0" class="OrgType" method="orgTypeService.addOrgType">
	 * @param entitys 添加的元素集合 <entity name="学校" sn="XX"></entity>
	 */
	private void addElements(String cname, String method, List<Element> entitys) {
		for (Element e : entitys) {
			addElement(cname, method, e);
		}
	}

	/**
	 * 添加元素
	 * @param cname 包名.类名
	 * @param method 方法名
	 * @param e 添加的元素
	 */
	private void addElement(String cname, String method, Element e) {
		Object obj = null;
		Object service = null;
		Method m = null;
		try {
			// 通过反射创建对象
			obj = Class.forName(cname).newInstance();
			// 拆分method="orgTypeService.addOrgType"获取业务service类名和方法
			String[] ms = method.split("\\.");
			if (ms.length != 2) {
				throw new GlobalException("方法格式不正确!");
			}
			String sname = ms[0];
			String mname = ms[1];
			@SuppressWarnings("unchecked")
			List<Attribute> attributes = (List<Attribute>) e.attributes();
			for (Attribute attribute : attributes) {
				// 元素属性名称
				String name = attribute.getName();
				// 元素属性值
				String value = attribute.getValue();
				try {
					// 导入的是com.sun.org.apache.commons.beanutils.BeanUtils,进行对象属性的赋值操作
					// 第一个参数:对象,第二个参数:属性,第三个参数:值
					BeanUtils.copyProperty(obj, name, value);
				} catch (IllegalAccessException e1) {
					e1.printStackTrace();
				} catch (InvocationTargetException e1) {
					e1.printStackTrace();
				}
			}
			// 通过Spring工厂获取业务逻辑类service
			service = beanFactory.getBean(sname);
			// 获取service方法 ,第一个参数:方法名称 ,第二个:参数类型
			m = service.getClass().getMethod(mname, obj.getClass());
			// 回调方法
			m.invoke(service, obj);
		} catch (BeansException e1) {
			e1.printStackTrace();
		} catch (SecurityException e1) {
			e1.printStackTrace();
		} catch (InstantiationException e1) {
			e1.printStackTrace();
		} catch (IllegalAccessException e1) {
			e1.printStackTrace();
		} catch (ClassNotFoundException e1) {
			e1.printStackTrace();
		} catch (NoSuchMethodException e1) {
			e1.printStackTrace();
		} catch (IllegalArgumentException e1) {
			e1.printStackTrace();
		} catch (InvocationTargetException e1) {
			e1.printStackTrace();
		}

	}
}



测试类:

package com.han.test;

import javax.inject.Inject;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.orm.hibernate4.SessionHolder;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.support.TransactionSynchronizationManager;

import com.han.service.InitService;

/**
 * @author hanwei
 * @date:2016-8-24 上午10:53:49
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/beans.xml")
public class CURDTest {
	@Inject
	private InitService initService;
	@Inject
	private SessionFactory sessionFactory;

	@Before
	public void setUp() {
		// 此时最好不要使用Spring的Transactional来管理,因为dbunit是通过jdbc来处理connection,再使用spring在一些编辑操作中会造成事务shisu
		Session s = sessionFactory.openSession();
		TransactionSynchronizationManager.bindResource(sessionFactory,new SessionHolder(s));
	}

	@After
	public void tearDown() {
		SessionHolder holder = (SessionHolder) TransactionSynchronizationManager.getResource(sessionFactory);
		Session s = holder.getSession();
		s.flush();
		TransactionSynchronizationManager.unbindResource(sessionFactory);
	}

	@Test
	public void testXml() {
		initService.addInitEntityByXml("init.xml");
	}
}

XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<entitys package="com.han.model">
  <initEntity exist="0" class="OrgType" method="orgTypeService.addOrgType">
    <entity name="学校" sn="XX"></entity>
    <entity name="分校" sn="FX"></entity>
    <entity name="校领导办" sn="XLDB"></entity>
    <entity name="行政部门" sn="XZBM"></entity>
    <entity name="教学部门" sn="JXBM"></entity>
    <entity name="专业" sn="ZY"></entity>
    <entity name="班级" sn="BJ"></entity>
  </initEntity>
</entitys>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值