数据库操作的封装

1、核心类Loader.java
package com.dreamoa.sys;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.dreamoa.util.ExtUtil;
import com.dreamoa.util.HibernateSessionFactory;
import com.dreamoa.util.StringUtil;

/**
 * 加载器,加载配置的query.xml文件中的hql
 * @author 忧里修斯
 */
public class Loader {
	
	private String fileName = "";//hql文件名称
	private String queryName = "";//查询字符串名称
	private String hql = "";
	private int totalCount = 0;//总记录数
	private Query query = null;
	private Transaction tx = null;
	private List resultsList = null;//查询结果集
	private Session session = null;
	private String[] paramsArr = null;//hql中参数名组成的数组
	private final String FOLDERPATH = "sqlFolder/";//sql文件夹名称
	private BaseParams baseParams = null;//参数集
	private String resultsJsonString = "";//json格式查询结果
	private String resultsXmlString = "";//xml格式查询结果
	private Logger log;
	
	public Loader(){}
	
	/**
	 * @param fileName 存放hql文件名
	 * @param queryName hql串的名称
	 * @param baseParams 基本参数
	 */
	public Loader(String fileName,String queryName,BaseParams baseParams){
		log = Logger.getLogger(Loader.class);
		this.fileName = fileName;
		this.queryName = queryName;
		this.hql = getHql(this.fileName, this.queryName);
		this.session = HibernateSessionFactory.getSession();
		//开启事务
		this.tx = this.session.beginTransaction();
		this.baseParams = baseParams;
		//创建query对象
		this.query = getQuery();
		run();
	}
	
	/**
	 * 执行操作,将基本的信息封装在Loader对象中
	 */
	public void run(){
		
		//打印出要执行的hql中的参数和实际值
		log.info("执行的hql为:"+this.fileName+"中的"+this.queryName);
		log.info("hql中需要的参数和实际值如下:");
		for (int i = 0; i < paramsArr.length; i++) {
			log.info(paramsArr[i]+":"+this.baseParams.getParams().get(paramsArr[i]));
		}
		
		String hql = this.hql.trim().toLowerCase();
		if(hql.startsWith("update") || hql.startsWith("delete")){//执行更新或删除操作
			execute();
			//提交事务
			tx.commit();
		}else{//执行查询
			
			//设置查询的记录数
			this.totalCount = getTotalCount();
			//设置List格式的结果集
			this.resultsList = getResult();
			//设置json格式的结果集
			this.resultsJsonString = getResultsJsonString();
			//设置xml格式的结果集
			this.resultsXmlString = getResultsXmlString();
		}
	}
	
	/**
	 * 根据文件名获取文档对象
	 * @param fileName
	 * @return Document
	 */
	public Document getDocument(String fileName){
		String classiPath = this.getClass().getResource("Loader.class").toString();
		String rootPath = classiPath.substring(classiPath.indexOf(":")+2, classiPath.lastIndexOf("classes")+8).replaceAll("%20", " ");
		String filePath = rootPath+FOLDERPATH+fileName;
		Document doc = null;
		SAXReader reader = new SAXReader();
		File file = new File(filePath);
		try {
			//获取xml文档对象
			doc = reader.read(file);
		} catch (DocumentException e) {
			log.error("Loader.java:获取文档对象失败");
			e.printStackTrace();
		}
		return doc;
	}
	
	/**
	 * 根据文件名和查询串名称获取查询语句hql
	 * @param fileName
	 * @param queryName
	 * @param baseParams 参数集
	 * @return String hqlString
	 */
	public String getHql(String fileName,String queryName){
		Document doc = getDocument(fileName);
		String hqlString = "";
		if(doc != null){
			//获取文档根节点
			Element root = doc.getRootElement();
			for (Iterator iterator = root.elementIterator("query"); iterator.hasNext();) {
				Element queryEl = (Element) iterator.next();
				//根据节点名获取唯一节点
				Node queryNameNode  = queryEl.selectSingleNode("queryName");
				if(queryNameNode.getText().equalsIgnoreCase(queryName)){
					Node queryStringNode  = queryEl.selectSingleNode("queryString");
					//获取节点值
					hqlString = queryStringNode.getText();
					this.hql = hqlString;
					break;
				}
			}
		}
		return hqlString;
	}
	
	/**
	 * 获取实际执行的query
	 * @return Query
	 */
	public Query getQuery(){
		
		Query query = this.session.createQuery(this.hql.trim());
		query = fillParams(query);
		return query;
	}
	
	/**
	 * 为query填充实际的参数值
	 * @param query
	 * @return
	 */
	public Query fillParams(Query query){
		
		//获取参数名称集
		String[] paramsArr = getParams();
		Map<String, Object> params = baseParams.getParams();
		
		if(paramsArr != null && params != null && params.size() > 0){//若有查询参数
			//动态绑定参数
			for (int i = 0; i < paramsArr.length; i++) {
				String paramName = paramsArr[i];
				Object paramValue = params.get(paramName);
				if(params.containsKey(paramName)){
					if(paramValue != null){
						query.setParameter(paramName, paramValue);
					}
				}
			}
		}
		
		//若分页
		if(baseParams.isPagging()){
			query.setFirstResult(baseParams.getStart());
			query.setMaxResults(baseParams.getLimit());
		}
		return query;
	}
	
	/**
	 * 从hql获取参数组成的数组
	 * hql参数名称如:userName
	 */
	public String[] getParams(){
		ArrayList<String> strList = new ArrayList<String>(); 
		String[] strArr = StringUtil.split(this.hql, " ");
		for (int i = 0; i < strArr.length; i++) {
			String v = strArr[i];
			if(v.startsWith(":")){
				v = v.substring(1, v.length());
				strList.add(v);
			}
		}
		if(strList != null && strList.size() > 0){
			String[] paramsArr = new String[strList.size()];
			for (int i = 0; i < strList.size(); i++) {
				paramsArr[i] = strList.get(i);
			}
			this.paramsArr = paramsArr;
			return paramsArr;
		}else{
			return null;
		}
	}
	
	/**
	 * 获取总记录数
	 * @return totalCount
	 */
	public int getTotalCount(){
		int totalCount = 0;
		String subhql = "";
		if(this.hql.lastIndexOf("group by")!=-1){
			subhql = this.hql.substring(this.hql.lastIndexOf("from"), this.hql.lastIndexOf("group by"));
		}else{
			subhql = this.hql.substring(this.hql.lastIndexOf("from"));
		}
		Query query = this.session.createQuery("select count(*) "+subhql);
		if(this.baseParams.getParams() != null && this.baseParams.getParams().size() > 0){//有参数
			query = fillParams(query);
		}
		totalCount = Integer.parseInt(query.uniqueResult().toString());
		return totalCount;
	}
	
	/**
	 * 获取查询的结果集
	 * @return results
	 */
	public List getResult(){
		List results = new ArrayList();
		results = this.query.list();
		return results;
	}
	
	/**
	 * 根据配置文件中hql执行更新和删除操作
	 */
	public void execute(){
		this.query.executeUpdate();
	}
	
	/**
	 * 获取json格式的查询结果
	 */
	public String getResultsJsonString(){
		return ExtUtil.getJsonFromList(this.totalCount, this.resultsList);
	}
	
	/**
	 * 获取xml格式的查询结果
	 */
	public String getResultsXmlString(){
		return ExtUtil.getXmlFromList(this.totalCount, this.resultsList);
	}
	
	/**
	 * 关闭session连接
	 */
	public void closeSession(){
		HibernateSessionFactory.closeSession();
	}
	
	/**
	 * 测试
	 * @param args
	 */
	public static void main(String[] args) {
		BaseParams bp = new BaseParams();
		bp.setPagging(true);
		bp.setStart(0);
		bp.setLimit(2);
		//bp.setAttribute("password", "123456");
		bp.setAttribute("userName", "帅哥");
		Loader loader = new Loader("main.xml","SEL",bp);
		System.out.println(loader.resultsXmlString);
	}
}

2、存放hql的文件格式如:
<?xml version="1.0" encoding="UTF-8"?>
<config>
	<query>
		<queryName>DEL</queryName>
		<queryString>delete User user where user.userName = :userName</queryString>
	</query>
	<query>
		<queryName>SEL</queryName>
		<queryString>from User user where user.userName = :userName</queryString>
	</query>
	<query>
		<queryName>UPDATE</queryName>
		<queryString>update User user set user.userName = :userName</queryString>
	</query>
</config>

你可能感兴趣的:(sql,xml,Hibernate,json,log4j)