`
tntxia
  • 浏览: 1507336 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

利用Java的反射机制实现的ORM数据库查询

阅读更多

我们在做Java的开发时,我们很不希望写SQL语句,因为Eclipse里面没有对SQL进行检查的机制,不小心写错了,我们很难在冗长的SQL语句中,找出要SQL语句的错误。所以我们喜欢用ORM方式来做数据库的操作。

 

这里我写了一个简单的实现ORM的操作的方法,希望对大家的工作会有一定的帮助。

 

 

1.首先我们要定义一个Java注释类,叫Id,自从Java1.5以后,我们可以用注释这种方法来取代以前用XML来定义的这种方法。

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface Id {
	public String name = "id";
}

 有了这个注释类后,我们可以定义一个实体的ID是哪一个属性。

2.接下来,我们就可以定义实体类了。我用的数据是SQLServer2005,但其实数据库应该可以适用。

数据库的表结构如下:

 

CREATE TABLE [dbo].[newsclass](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[name] [varchar](45) COLLATE Chinese_PRC_CI_AS NOT NULL,
 CONSTRAINT [PK__newsclass__7F60ED59] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF

 

我们定义一个NewsClass类,来对应这张表,

public class NewsClass {
	@Id 
	private String id;
	private String name;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

 

接下来,我们可以定义一个Dao的类,叫ORMDao。

public class ORMDao {
	
	/**
	 * 获取实体的ID值
	 * 
	 * @param entity
	 * @return
	 */
	public String getIdField(Object entity) {

		String idField = null;
		try {
			Field[] fields = Class.forName("com.trip.info.entity.News")

			.getDeclaredFields();

			System.out.println(fields.length);

			Annotation[] annotations;

			for (Field field : fields) {

				annotations = field.getDeclaredAnnotations();

				for (Annotation a : annotations) {
					if (a.annotationType().getSimpleName().equals("Id")) {
						idField = field.getName();
					}
				}
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return idField;
	}

	/**
	 * 对象查询
	 * 
	 * @param entity
	 * @param pageNo
	 * @param pageSize
	 * @param orderType
	 * @return
	 * @throws Exception
	 */
	public void query(Object entity){

		Field[] fields = entity.getClass().getDeclaredFields();

		String sqlSelect = "";

		String sqlWhere = "";

		String sql = "";

		Class cl = entity.getClass();

		boolean firstFlag = true;

		ArrayList<String> cols = new ArrayList<String>();
		
		String id = this.getIdField(entity);
		
		String className = entity.getClass().getSimpleName();

		for (int i = 0; i < fields.length; i++) {

			String fieldName = fields[i].getName();
			if (i != fields.length - 1) {
				sqlSelect += fieldName + ",";
			} else {
				sqlSelect += fieldName;
			}

			cols.add(fieldName);

			String methodName = "get" + fieldName.substring(0, 1).toUpperCase()
					+ fieldName.substring(1, fieldName.length());
			

			

			try{
				if (cl.getMethod(methodName).invoke(entity) != null) {
					if (firstFlag) {
						sqlWhere += " where " + fieldName + "='"
								+ cl.getMethod(methodName).invoke(entity) + "'";
						firstFlag = false;
					} else {
						sqlWhere += " and " + fieldName + "='"
								+ cl.getMethod(methodName).invoke(entity) + "'";
					}
				}
			}catch(Exception e){
				e.printStackTrace();
			}
			
		}

		
		sql = "select " + sqlSelect + " from "
					+ className + sqlWhere;

		System.out.println("the final sql :" + sql);

	}

	public static void main(String[] args) {
		ORMDao dao = new ORMDao();
		NewsClass newsclass = new NewsClass();
		newsclass.setId("1");
		newsclass.setName("国际新闻");
		dao.query(newsclass);

	}

}

 

4. 用这种方法,我们对于单表的查询,不再需要自己写SQL代码,而是用Java对象来对应,自动生成SQL代码,大大减轻了开发的难度和开发量。

 

0
0
分享到:
评论
3 楼 tntxia 2010-07-09  
主键的注释,有些情况下,我们必须了解实体中,哪个属性是主键
2 楼 guoguo1010 2010-07-06  
可以问下  刚开始注释的那个id有什么用啊
1 楼 guoguo1010 2010-07-02  
麻烦能不能写下注释啊  谢谢了哈

相关推荐

    基于Java动态代理和反射机制实现ORM

    本篇文章将深入探讨如何在Java环境下,结合MySQL数据库,利用动态代理和反射技术来实现简单的ORM框架。 首先,我们需要了解动态代理和反射的基本概念。动态代理是在运行时创建一个接口的实现类,这个实现类会调用...

    通过类反射机制实现底层数据库连接

    在数据库连接中,反射机制被广泛应用,特别是在ORM(Object-Relational Mapping)框架如Hibernate中,它帮助我们实现了对底层数据库的操作。 Hibernate是一个流行的Java ORM框架,它的核心功能是将Java对象映射到...

    利用java反射、注解及泛型模拟ORM实现

    这篇博文“利用java反射、注解及泛型模拟ORM实现”旨在探讨如何结合这三种技术来实现对象关系映射(ORM),这是一种将数据库表与Java对象之间进行绑定的技术,简化了数据操作。 首先,我们来理解一下这三个概念: ...

    [反射机制]简单实现ORM

    在本案例中,"简单实现ORM"是指通过反射机制来实现对象关系映射(Object-Relational Mapping),这是一种将数据库中的数据与Java对象之间建立映射关系的技术,使得开发者可以更方便地操作数据库。 ORM的主要目的是...

    Java反射机制在数据持久层轻量级ORM框架中的应用研究.pdf

    由于Java反射机制允许程序在运行时构造和访问任何类的属性和方法,它为Reflect-ORM框架提供了实现的理论基础。通过反射,框架可以动态地读取对象的属性信息,将这些信息转换为数据库的表结构,以及将数据库查询结果...

    Java的动态代理、反射机制和数据库连接池技术

    Java反射的核心类包括`java.lang.Class`、`java.lang.reflect.Method`、`java.lang.reflect.Field`等。通过这些类,我们可以获取类的信息,创建类的实例,甚至在运行时调用私有方法和修改私有字段。 数据库连接池...

    java 解析xml类映射数据库 数据库操作 反射机制 源码

    本程序集的核心是利用Java解析XML文件,将XML中的数据映射到数据库,并通过反射机制进行数据库操作。下面将详细阐述这些知识点。 首先,XML解析在Java中通常有两种方式:DOM(Document Object Model)和SAX(Simple...

    Java反射机制

    ### Java反射机制详解 #### 一、什么是Java的反射机制 Java反射机制是Java语言的一种重要特性,使得Java成为了一种动态性很强的语言。通过反射,可以在程序运行时获取类的信息,包括类名、父类、接口、字段、方法...

    java反射机制,很安逸.不要错过

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查并操作类、接口、字段和方法的信息,打破了通常编译时静态绑定的限制。通过反射,我们可以动态地创建对象,调用方法,访问和修改字段值,甚至...

    实战java反射机制-让你迅速认识java强大的反射机制

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法的信息,甚至动态地创建对象并调用其方法。通过反射,开发者可以实现高度灵活和动态的代码,这对于框架开发、元编程...

    java注解、java反射机制 jdbc 封装

    接着,我们来看Java反射机制。反射允许程序在运行时检查类、接口、字段和方法的信息,甚至可以动态调用方法和访问字段。在JDBC封装中,反射非常有用,因为它允许在运行时创建和执行SQL语句,而不必在代码中硬编码...

    Java反射机制经典案例

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查并操作类、接口、字段和方法等对象。这种能力使得Java代码能够具备动态性,可以在不知道具体类名的情况下实例化对象,调用方法,访问字段,以及...

    java反射机制原理

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

    java的反射机制及其实际应用

    ### Java的反射机制及其实际应用 #### 一、引言 ...总之,Java反射机制是一项强大的工具,它能够在运行时动态地获取和操作类的信息。然而,应该谨慎使用反射,避免滥用造成不必要的性能损失或安全风险。

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

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

    Java反射机制在数据持久层轻量级ORM框架中的应用研究.zip

    综上所述,Java反射机制在数据持久层轻量级ORM框架中扮演着核心角色,它使得框架能够灵活地处理对象与数据库之间的映射,降低了开发难度,提高了代码的可维护性和可扩展性。然而,虽然反射带来了诸多便利,但也需要...

    Java 反射机制浅析

    总之,Java反射机制为开发者提供了运行时的灵活性,让我们能够以一种动态的方式操控类和对象,从而实现了许多高级功能。在理解和使用反射时,需要权衡其优点和潜在的风险,合理地将其应用于项目中。

    java反射机制

    - 数据库操作:ORM框架如Hibernate利用反射将数据库记录映射为Java对象。 - 测试工具:JUnit测试框架使用反射来执行测试方法。 - 动态代理:动态生成实现特定接口的代理对象,如动态数据访问对象(DAO)或动态...

    java反射机制详解

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象以及它们的方法和字段。通过反射,开发者可以实现动态类型检查、元编程、插件系统等功能,大大增强了代码的灵活性。以下是...

Global site tag (gtag.js) - Google Analytics