`
忧里修斯
  • 浏览: 436538 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

数据库操作的封装

阅读更多
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>
分享到:
评论

相关推荐

    Qt sqlite 数据库操作封装

    总结起来,Qt的SQLite数据库操作封装涉及到以下几个关键点: 1. 生成和打开数据库文件。 2. 执行SQL语句,包括查询、插入、更新和删除。 3. 设计接口,提供增删改查的重载功能。 4. 实现事务管理,确保数据一致性。 ...

    windows关于qt的数据库操作封装类以及用例,c++代码

    windows 关于qt的数据库操作封装类 以及用例: SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它的功能特点有: 1. ACID事务 2. 零配置 – 无需安装和管理配置 3....

    C# 数据库操作封装类

    本主题将详细探讨“C#数据库操作封装类”的设计和应用,以及如何利用此类来简化数据库操作。 首先,"COleDbOperate.cs"文件可能包含一个通用的数据库操作类,它使用ADO.NET中的System.Data.OleDb命名空间,支持多种...

    php数据库操作封装类.zip

    在PHP开发中,数据库操作是不可或缺的一部分,为了提高代码的可维护性和复用性,开发者通常会将数据库操作封装成类。"php数据库操作封装类.zip"提供的就是一个这样的工具,它可以帮助我们更方便、高效地处理数据库...

    android数据库操作封装

    "android数据库操作封装"主要是为了提高代码的可读性、可维护性和复用性,通过创建自定义的数据访问对象(DAO)层和数据库帮助类来实现。 1. 数据库Helper类: 在Android中,我们通常会创建一个继承自`...

    JAVA基础:将数据库操作封装到Javabean文档信息

    JAVA 基础:将数据库操作封装到 Javabean 文档信息 在 Java 开发中,数据库操作是一个非常重要的部分,但是直接使用 Java.sql 包中的类来操作数据库,会带来一些问题,例如资源未释放的问题。为了解决这些问题,...

    .Net中的数据库操作封装

    此程序基于Visual studio 2005 英文版,主要是为了示例.net中用oledb方式对数据库操作(增删查改)的封装,包括了所有源码,适合入门者,我已调试无误(其中我基本上未进行容错处理,因为此程序的主要目的是对数据库的...

    Java数据库操作封装类

    "Java数据库操作封装类"的设计往往借鉴了如JDBC(Java Database Connectivity)、Hibernate、MyBatis等主流类库的思想。JDBC是Java中标准的数据库访问接口,它提供了与各种数据库通信的能力,但其API较为底层,使用...

    java数据库操作封装类

    "java数据库操作封装类"是一个为了简化数据库交互而设计的Java类。它将基础的JDBC(Java Database Connectivity)操作进行封装,使得开发者可以更方便、高效地执行常见的数据库操作,如连接、查询、插入、更新和删除...

    C#数据库操作封装类

    在本场景中,我们讨论的是一个名为"C#数据库操作封装类"的自定义实现,它是一个dll库(myFunClsLib.DataBase.dll),用于简化对SQL Server、Access和Oracle这三种常见数据库的访问。下面我们将深入探讨这个封装类...

    Access 数据库操作封装类库

    本篇将详细讲解"Access数据库操作封装类库"的相关知识点,以及如何通过封装提高代码的复用性和可维护性。 首先,"Access数据库操作"涉及到的是对Microsoft Office Access数据库的CRUD(创建、读取、更新和删除)...

    数据库操作封装demo

    "数据库操作封装demo"是一个示例项目,旨在展示如何通过编程接口(API)来封装常见的数据库操作,以提高代码的复用性和可维护性。下面,我们将深入探讨这个主题。 首先,数据库封装是指将底层的SQL语句和连接管理...

    jsp数据库连接大全和数据库操作封装到Javabean

    本教程将详细阐述如何在JSP中建立数据库连接以及如何将数据库操作封装到JavaBean中,以便实现更高效、更可维护的代码。 首先,我们要了解JSP的基础。JSP是一种服务器端脚本语言,用于创建动态网页。它允许开发者在...

    将数据库操作封装到Javabean

    ### 将数据库操作封装到JavaBean #### 一、引言 在软件开发过程中,数据库操作是必不可少的一部分。为了提高代码的复用性与可维护性,通常会将数据库的操作进行封装,形成一种统一的数据访问层(Data Access Layer,...

    MYSQL数据库操作封装

    对连接MYSQL及之后的操作进行一个封装类。

    JAVA:数据库操作封装

    ### JAVA:数据库操作封装 #### 概述 在Java开发中,进行数据库操作是一项非常常见的任务。为了提高代码的可维护性、复用性和降低出错率,通常会将常用的数据库操作方法进行封装,形成一个统一的操作接口。这种...

    C#数据库操作封装

    C#数据库操作封装,主要应用C#开发上位机对SQL Server数据的读写操作进行封装。

    .net企业库中数据库操作封装

    总的来说,.NET企业库中的数据库操作封装极大地提高了代码的可读性和可维护性,降低了开发复杂性,让开发者能更专注于业务逻辑,而不是底层的数据库操作细节。结合配置文件和面向接口的设计,它使得数据库操作具有更...

    Python3实现的Mysql数据库操作封装类

    本文实例讲述了Python3实现的Mysql数据库操作封装类。分享给大家供大家参考,具体如下: #encoding:utf-8 #name:mod_db.py ''''' 使用方法:1.在主程序中先实例化DB Mysql数据库操作类。 2.使用方法:db=database()...

Global site tag (gtag.js) - Google Analytics