`

java利用反射机制完成所有hibernate的模糊、非模糊查询。可以按条件查询

阅读更多
利用反射机制完成所有hibernate的模糊、非模糊查询。可以按条件查询

有的时候我们会遇到这样的情况,比如图书馆有很多本书,这时候我们要按照书名查询,按照类别查询,按照作者查询,或者按照ISBN查询,并且有可能一次按照多个条件查询,这时候通常会需要如下的hql或者sql语句。

① from Book b

where b.bookName=”红楼梦“ and b.bookAuthor=”施耐庵” ……

② Select * from tb_book b where

b.bookName=”红楼梦“ and b.bookAuthor=”施耐庵” ……

并且在写servlet或者使用struts写action的时候需要针对不同的查询调用不同的DAO层,因此往往servlet或者dao需要写多个类似处理代码,他们几乎相同。

其实针对查询这些信息的时候我们完全可以利用反射机制来自动生成一条hql或者sql语句执行,不需要每次都写出新的语句,这样既不利于维护,也不利于开发。

我的设想就是,不管是否使用ORM框架,都需要有实体类对应数据库的表,而这些实体类的属性就对应了表的字段。

我们如果能利用一个实体类来进行针对自身不为null的属性生成hql或者sql语句,那么就可以利用一个查询的dao完成所有类型的查询了。

下面给出我写的hqlModel,这个类是一个用来生成查询语句的。

此类的中心思想就是自动生成查询语句,只要给定一个Object类型,就可以“自动”根据类的属性调用getter方法来获取值。如果值不为空,就按照该值来进行条件查询,如果没有任何属性被赋值,那么他将认为要生成form Book 这样的查询语句。

这样不管是查询所有数据,查询指定数据,多条件查询指定数据,都可以用同一个方法来执行。

至于模糊或者非模糊,只要给定一个boolean,然后判断就可以了。这样用setter作为其是否开启模糊查询的开关。

package com.leaves.daoUtil;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 此类用来创建hql查询语句,能自动生成如下格式hql语句。<br>
 * from BookInfo where bookNameId='null' and bookName='《三国演义》' and
 * bookAuthor='施耐庵' ;<br>
 * 使用getHql()方法来创建hql语句,此方法调用会抛出异常。<br>
 * 此类需要你为其提供一个带有get和set方法的bean,类会根据其get的方法获得其值,如果get属性不为null则添加where条件。<br>
 * 如果没有设置任何方法,则默认生成from BookInfo形式HQL语句。
 * 
 * @version 1.0.0.0
 * @author leaves叶知泉,<a href="http://www.c5ms.com">官方网站www.c5ms.com</a>
 * 
 */
public class HqlModel {

	private Object object;

	/**
	 * 是否开启模糊查询
	 */
	private boolean likeSel;

	public boolean isLikeSel() {
		return likeSel;
	}

	/**
	 * 设置属性是否开启模糊查询
	 * 
	 * @param likeSel
	 */
	public void setLikeSel(boolean likeSel) {
		this.likeSel = likeSel;
	}

	public Object getObject() {
		return object;
	}

	public void setObject(Object object) {
		this.object = object;
	}

	/**
	 * 允许不带参数实例化
	 */
	private HqlModel() {
	}

	/**
	 * 使用指定的对象来获取一个HqlModel实例
	 * 
	 * @param object
	 *            实例化时所需要的DTO对象
	 */
	public static HqlModel newInstanceByObj(Object object) {
		HqlModel hqlModel = new HqlModel();
		hqlModel.setObject(object);
		return hqlModel;
	}

	/**
	 * 用来进行创建hql语句的方法, 此方法可能抛出异常
	 * 
	 * @return 根据传入对象的get方法构建的hql语句
	 */
	public String getHql() throws Exception {
		// 预准备好的hql语句。
		StringBuffer sbf = new StringBuffer("from Object where ");
		// 得道给定实例的类型。
		Class<?> theClass = this.getObject().getClass();
		// 使用类名替换Object字符串。
		sbf.replace(5, 11, theClass.getSimpleName());
		// 活的该类所有属性。
		Field[] fields = object.getClass().getDeclaredFields();

		// 遍历所有属性
		for (Field field : fields) {
			PropertyDescriptor pd = new PropertyDescriptor(field.getName(),
					theClass);
			// 获得所有属性的读取方法
			Method getMethod = pd.getReadMethod();
			// 执行读取方法,获得属性值
			Object objTemp = getMethod.invoke(object);
			// 如果属性值为null,就略过
			if (objTemp == null) {
				continue;
			}
			// 如果不为空。
			// 判断是否开启模糊查询,添加查询条件,并且加上%%符号。
			if (isLikeSel()) {
				sbf.append(field.getName() + " like '%" + objTemp + "%'");
				sbf.append(" and ");
			}//同理添加查询条件,不添加%%符号。
			else {
				sbf.append(field.getName() + "='" + objTemp + "'");
				sbf.append(" and ");
			}
		}
		//最后一个属性设置完成之后取出残余的and和尾部的空格。
		if (sbf.toString().endsWith("and ")) {
			sbf.delete(sbf.length() - "and".length() - 1, sbf.length());
		}
		//如果没有设置任何属性,则取出尾部的where字符串和后面的空格。
		if (sbf.toString().endsWith("where ")) {
			sbf.delete(sbf.length() - "where".length() - 1, sbf.length());
		}
		//返回生成好的语句。
		return sbf.toString();
	}

}









目前属于1.0版本,还不支持sql语句生成,其实都是一个道理,只要在类中修改 StringBuffer sbf = new StringBuffer(“from Object where ”);这一句就能完成。

希望朋友们修改出更好的生成器之后能跟小弟一起分享,多多指教。

此类不足之处:

·没有sql、hql切换的开关

·理论上还可以生成update和save这样的语句,只是小弟还没有想到设计。
分享到:
评论
1 楼 980109763 2013-03-05  
[i][i][i][i]sdfdsfsdfds      [/i][/i][/i][/i]

相关推荐

    hibernate 模糊查询 分页

    当我们想要实现模糊查询时,可以利用`Criteria` API或者`HQL`(Hibernate Query Language)来完成。例如,如果我们要查询一个名为`User`的实体类中所有名字包含"John"的用户,可以这样做: ```java Session session...

    Java 1.5 反射机制

    例如,它利用反射加载和保存数据库实体,调用getter和setter方法来映射属性,以及执行HQL(Hibernate查询语言)中的动态方法调用。 总结来说,Java 1.5的反射机制极大地增强了Java的灵活性和动态性,使得开发者能够...

    JAVA,多条件,模糊查询,多个条件同时查询显示结果

    在实际应用中,你可能会使用ORM框架,如Hibernate或MyBatis,它们提供了更高级别的抽象,可以简化数据库操作,但基本的多条件模糊查询原理仍然相同。 此外,对于性能优化,可以考虑使用索引、分页查询、延迟加载等...

    Hibernate-Criteria_模糊查询

    通过上述介绍,我们可以看到,利用Hibernate的Criteria API进行模糊查询不仅提供了极大的灵活性,还极大地简化了查询语句的编写过程,使得开发者能够更加专注于业务逻辑的实现。当然,随着项目的复杂度增加,可能还...

    java反射机制PPT

    此外,由于反射可以访问私有成员和调用非公开的方法,如果不加以控制,可能会破坏封装性,增加代码的复杂性和潜在的安全风险。 代理模式是设计模式中的一种,主要用来在不修改原有对象的情况下,为对象添加额外功能...

    Hibernate-Criteria 模糊查询

    ### Hibernate-Criteria 模糊查询详解 在Java的持久化技术中,Hibernate作为ORM(对象关系映射)框架的一种,提供了强大的数据访问能力。而其中的`Criteria`接口更是为复杂的查询需求提供了一种灵活且功能强大的...

    hibernate的HQL的模糊查询

    在Java的持久化框架Hibernate中,HQL(Hibernate Query Language)是专为ORM(对象关系映射)设计的一种SQL方言,...通过理解并熟练掌握这些概念,可以更好地利用Hibernate进行数据操作,提升项目的开发效率和质量。

    Java反射机制经典案例

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查并操作类、接口、字段和方法等对象。这种能力使得Java代码能够...在实际编程中,合理利用反射可以提高代码的灵活性,但同时也需注意其潜在的风险。

    java反射机制原理

    Java反射机制是Java编程语言中的一个核心特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这一机制使得Java具备了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用方法和访问...

    Java_Hibernate QBC条件查询对比

    本篇文章将深入探讨Hibernate中的QBC(Query By Example)条件查询与传统的HQL(Hibernate Query Language)查询的对比,帮助开发者更好地理解和选择适合的查询方式。 QBC(Query By Example)是Hibernate提供的一...

    Java反射机制的详细讲解及实例,有助于java深度开发

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法等对象。这一机制对于理解和利用Java的动态性至关重要,尤其是在进行复杂系统设计、框架开发以及元数据驱动的应用中...

    浅论泛型与反射机制结合(hibernate)

    在Java编程语言中,泛型和反射机制是两个非常重要的概念,它们各自有着独特的作用,同时在特定场景下,如Hibernate框架中,两者的结合能够实现更强大的功能。本篇文章将深入探讨泛型与反射机制的基本概念,以及它们...

    Java 反射机制浅析

    2. **序列化与反序列化**:序列化框架如Java的`java.io.Serializable`接口,通常利用反射来处理类的字段。 3. **ORM框架**:如Hibernate,使用反射来映射数据库记录到Java对象。 4. **测试工具**:JUnit等测试框架...

    java反射机制详解与应用.pdf

    * 实现动态代理:Java 反射机制可以用来实现动态代理,例如在 Hibernate 框架中。 Java 反射机制的主要方法包括: * getClass():获取当前对象的 Class 对象。 * Class.forName():获取指定名称的 Class 对象。 * ...

    反射机制数据库万能查询代码简化

    在这个“反射机制数据库万能查询代码简化”的主题中,我们将深入探讨如何利用反射来优化HQL(Hibernate Query Language)数据库查询。 HQL是Hibernate框架提供的一个SQL的面向对象替代品,它允许开发者以对象的方式...

    hibernate 反射原理

    描述:本文章旨在深入探讨Java与Hibernate框架结合时所涉及的反射原理,通过解析Java反射机制的基础知识,理解Hibernate如何利用反射技术实现对象关系映射(ORM)。 ### Java反射原理概览 Java反射是Java语言的一...

    使用java的反射机制来模拟hibernater的jdbc操作

    在本案例中,我们将探讨如何利用反射机制来模拟Hibernate的JDBC操作,实现数据库的增删改查(CRUD)功能,以及简单的分页封装。 首先,让我们了解什么是Hibernate。Hibernate是一个强大的对象关系映射(ORM)框架,...

Global site tag (gtag.js) - Google Analytics