数据库操作的封装

本文介绍了一种通过配置文件管理HQL查询的方法,利用Java实现动态加载与执行HQL语句,支持查询、更新和删除操作,并能返回JSON或XML格式的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值