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数据库操作封装涉及到以下几个关键点: 1. 生成和打开数据库文件。 2. 执行SQL语句,包括查询、插入、更新和删除。 3. 设计接口,提供增删改查的重载功能。 4. 实现事务管理,确保数据一致性。 ...
windows 关于qt的数据库操作封装类 以及用例: SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它的功能特点有: 1. ACID事务 2. 零配置 – 无需安装和管理配置 3....
本主题将详细探讨“C#数据库操作封装类”的设计和应用,以及如何利用此类来简化数据库操作。 首先,"COleDbOperate.cs"文件可能包含一个通用的数据库操作类,它使用ADO.NET中的System.Data.OleDb命名空间,支持多种...
在PHP开发中,数据库操作是不可或缺的一部分,为了提高代码的可维护性和复用性,开发者通常会将数据库操作封装成类。"php数据库操作封装类.zip"提供的就是一个这样的工具,它可以帮助我们更方便、高效地处理数据库...
"android数据库操作封装"主要是为了提高代码的可读性、可维护性和复用性,通过创建自定义的数据访问对象(DAO)层和数据库帮助类来实现。 1. 数据库Helper类: 在Android中,我们通常会创建一个继承自`...
JAVA 基础:将数据库操作封装到 Javabean 文档信息 在 Java 开发中,数据库操作是一个非常重要的部分,但是直接使用 Java.sql 包中的类来操作数据库,会带来一些问题,例如资源未释放的问题。为了解决这些问题,...
此程序基于Visual studio 2005 英文版,主要是为了示例.net中用oledb方式对数据库操作(增删查改)的封装,包括了所有源码,适合入门者,我已调试无误(其中我基本上未进行容错处理,因为此程序的主要目的是对数据库的...
"Java数据库操作封装类"的设计往往借鉴了如JDBC(Java Database Connectivity)、Hibernate、MyBatis等主流类库的思想。JDBC是Java中标准的数据库访问接口,它提供了与各种数据库通信的能力,但其API较为底层,使用...
"java数据库操作封装类"是一个为了简化数据库交互而设计的Java类。它将基础的JDBC(Java Database Connectivity)操作进行封装,使得开发者可以更方便、高效地执行常见的数据库操作,如连接、查询、插入、更新和删除...
在本场景中,我们讨论的是一个名为"C#数据库操作封装类"的自定义实现,它是一个dll库(myFunClsLib.DataBase.dll),用于简化对SQL Server、Access和Oracle这三种常见数据库的访问。下面我们将深入探讨这个封装类...
本篇将详细讲解"Access数据库操作封装类库"的相关知识点,以及如何通过封装提高代码的复用性和可维护性。 首先,"Access数据库操作"涉及到的是对Microsoft Office Access数据库的CRUD(创建、读取、更新和删除)...
"数据库操作封装demo"是一个示例项目,旨在展示如何通过编程接口(API)来封装常见的数据库操作,以提高代码的复用性和可维护性。下面,我们将深入探讨这个主题。 首先,数据库封装是指将底层的SQL语句和连接管理...
本教程将详细阐述如何在JSP中建立数据库连接以及如何将数据库操作封装到JavaBean中,以便实现更高效、更可维护的代码。 首先,我们要了解JSP的基础。JSP是一种服务器端脚本语言,用于创建动态网页。它允许开发者在...
### 将数据库操作封装到JavaBean #### 一、引言 在软件开发过程中,数据库操作是必不可少的一部分。为了提高代码的复用性与可维护性,通常会将数据库的操作进行封装,形成一种统一的数据访问层(Data Access Layer,...
对连接MYSQL及之后的操作进行一个封装类。
### JAVA:数据库操作封装 #### 概述 在Java开发中,进行数据库操作是一项非常常见的任务。为了提高代码的可维护性、复用性和降低出错率,通常会将常用的数据库操作方法进行封装,形成一个统一的操作接口。这种...
C#数据库操作封装,主要应用C#开发上位机对SQL Server数据的读写操作进行封装。
总的来说,.NET企业库中的数据库操作封装极大地提高了代码的可读性和可维护性,降低了开发复杂性,让开发者能更专注于业务逻辑,而不是底层的数据库操作细节。结合配置文件和面向接口的设计,它使得数据库操作具有更...
本文实例讲述了Python3实现的Mysql数据库操作封装类。分享给大家供大家参考,具体如下: #encoding:utf-8 #name:mod_db.py ''''' 使用方法:1.在主程序中先实例化DB Mysql数据库操作类。 2.使用方法:db=database()...