`
xucheng271
  • 浏览: 914 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

java 自定义注解解析 模拟Hibernate 的ORM

阅读更多

解析注解

通过反射获取类、函数或者成员运行时的注解信息,从而实现动态控制程序运行的逻辑。

 

根据imooc网的学习自行整理

1、首先建立JavaBean,如Student.java,Course.java

package com.imooc.sqlann;

@Table("student")
public class Student {
	@Column("stuid")
	private int id;
	@Column("stuname")
	private String name;
	@Column("stuage")
	private int age;
	@Column("stuemail")
	private String email;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}
	
	
	
}

 

package com.imooc.sqlann;

@Table("course")
public class Course {
	@Column("couid")
	private int id;
	@Column("couname")
	private String name;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	
}

 

2、因JavaBean中使用了自定义注解,因而需要自行定义Annotation,如Table.java,Column.java

package com.imooc.sqlann;

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

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
	String value();
}

 

 

package com.imooc.sqlann;

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

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
	String value();
}

 

3、创建ParseSQLAnn进行注解解析

3.1 传入参数Object obj

3.2 获取入参的类类型Class

3.3 找到类上的Table注解

3.4 获取字段名与Column列名

3.5 通过invoke反射求出字段值

3.6 拼凑SQL语句

package com.imooc.sqlann;

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

public class ParseSQLAnn {

	public static String query(Object obj){
		StringBuffer sb = new StringBuffer();
		sb.append("select * from ");
		//1、获得obj对应的class
		Class c = obj.getClass();
		//2、找到类上的注解
		boolean isExit;
		isExit = c.isAnnotationPresent(Table.class);
		if(!isExit){
			return null;
		}
		Table tab = (Table) c.getAnnotation(Table.class);
		String tableName = tab.value();
		sb.append(tableName).append(" where 1=1");
		//3、获取字段名
		Field[] fs = c.getDeclaredFields();
		for(Field f : fs){
			isExit = f.isAnnotationPresent(Column.class);
			if(!isExit){
				continue;
			}
			Column col = (Column)f.getAnnotation(Column.class);
			String columnName = col.value();
			String fieldName = f.getName();
			//4、获取字段值,反射机制
			String getName = "get";
			getName = getName + fieldName.substring(0, 1).toUpperCase()
					+ fieldName.substring(1);
			Object fieldValue = null;
			try {
				Method m = c.getMethod(getName);
				fieldValue = m.invoke(obj);
			} catch (Exception e) {
				e.printStackTrace();
			}
			if (fieldValue == null || 
					(fieldValue instanceof Integer && (Integer) fieldValue == 0)) {
				continue;
			}else{
				sb.append(" and ").append(columnName);
				if (fieldValue instanceof String) {
					if(((String) fieldValue).contains(",")){
						String[] ss = ((String) fieldValue).split(",");
						sb.append(" in(");
						for(String s : ss){
							sb.append("'").append(s).append("'").append(",");
						}
						sb.deleteCharAt(sb.length()-1);
						sb.append(")");
 					}else{
						sb.append(" = '").append(fieldValue).append("'");
					}
				} else if (fieldValue instanceof Integer) {
					sb.append(" = ").append((Integer) fieldValue);
				}
			}
		}
		return sb.toString();
		
	}
	
}

 

4、编写测试类进行测试

package com.imooc.sqlann;

public class SQLTest {

	public static void main(String[] args) {
		Student s1 = new Student();
		s1.setAge(10);
		s1.setName("huxiao");
		
		Student s2 = new Student();
		s2.setName("huda");
		
		Student s3 = new Student();
		s3.setEmail("huda@126.com,xiaoming@qq.com");
		
		String sql1 = ParseSQLAnn.query(s1);
		String sql2 = ParseSQLAnn.query(s2);
		String sql3 = ParseSQLAnn.query(s3);
		
		System.out.println(sql1);
		System.out.println(sql2);
		System.out.println(sql3);
		
		Course c1 = new Course();
		c1.setName("Java开发");
		String sql4 = ParseSQLAnn.query(c1);
		System.out.println(sql4);
	}

}

 

5、结果

 



分享到:
评论

相关推荐

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

    开发者可以在类、方法、变量等声明上添加注解,然后自定义注解处理器解析这些信息以执行特定的操作,比如代码生成、验证、持久化等。在ORM中,注解常用于标记需要映射的数据库字段和表信息。 3. 泛型(Generics):...

    反射+注解自定义ORM

    为了简化开发,可以创建一系列工具类,如DBUtil(数据库工具类)、AnnotationParser(注解解析器)、SQLGenerator(SQL生成器)等。这些工具类可以帮助开发者更高效地进行ORM相关的操作,如连接数据库、解析注解...

    模拟hibernate注解功能

    在这个名为“模拟hibernate注解功能”的项目中,我们将探讨如何利用自定义注解和反射技术来模仿Hibernate的注解功能。 首先,让我们理解一下Hibernate的注解。Hibernate支持JPA(Java Persistence API)标准,其中...

    hibernate注解功能模拟

    总之,"hibernate注解功能模拟"是一个综合性的学习项目,它涵盖了Java的高级特性以及ORM框架的核心思想。通过实践,你可以巩固和提升Java编程技能,同时对数据库管理和数据持久化有更深入的认识。

    自定义Orm框架的实现

    本项目旨在实现一个基于JDK5.0注解的小型ORM框架,模拟Hibernate的部分功能。 首先,我们要理解ORM的基本原理。ORM的核心思想是将数据库中的表映射为Java对象,将表中的记录映射为对象的实例,这样就可以通过操作...

    Hibernate原理解析

    Hibernate是一个开源的Java语言下的对象关系映射(ORM)框架,它为开发者提供了在Java应用程序中操作数据库的强大工具。通过Hibernate,开发者可以将数据库操作与业务逻辑解耦,使得代码更加面向对象,提高了开发...

    EasyOrm:这是一个模拟Hibernate和MyBatis的简单orm框架

    EasyOrm是一个旨在简化Java开发中的对象关系映射(ORM)过程的框架,它借鉴了Hibernate和MyBatis的优秀特性,以提供一个轻量级、易于使用的解决方案。ORM框架的主要目的是将数据库操作与业务逻辑解耦,使得开发者...

    Hibernate实例 oracel数据库

    1. **Hibernate框架**: Hibernate是Java中的一个开源ORM(对象关系映射)框架,它简化了数据库操作,通过将Java对象与数据库表映射,使得开发者可以避免编写大量的SQL语句。 2. **Oracle数据库**: Oracle是企业级的...

    spring+hibernate+struts+XFire的webService实例

    2. **Hibernate ORM**:Hibernate是一个强大的对象关系映射(ORM)工具,它可以将Java类与数据库表进行映射,简化了数据库操作。在这个实例中,Hibernate用于处理数据库交互,如CRUD(创建、读取、更新、删除)操作...

    java 面试经验.docx

    - **自定义注解**: 学会如何定义自定义注解以及如何使用它们。 - **内置注解**: 熟悉@Override、@Deprecated等注解的含义和使用场景。 **设计模式** - **单例模式**: 掌握单例模式的实现方法及其应用场景。 - **...

    Java典型应用彻查1000例第四卷:数据库应用基础(源码+PPT+习题).rar

    6. JPA(Java Persistence API):Java官方的持久化规范,提供了ORM的统一标准,通过注解或XML配置,可以实现对象与数据库表的自动映射。 7. 数据库事务:Java通过JDBC支持ACID(原子性、一致性、隔离性和持久性)...

    spring mvc学习代码

    通过实现HandlerInterceptor接口或者使用自定义注解+@AspectJ实现。 6. **配置**:Spring MVC的配置通常包括Spring的Context配置(如bean定义、依赖注入)和Spring MVC的DispatcherServlet配置(如视图解析器、拦截...

    课设服装连锁商店调货系统

    Hibernate ORM工具则与数据库进行交互,通过配置XML文件或注解,将Java类与数据库表进行映射。它提供了强大的查询语言HQL(Hibernate Query Language)和Criteria API,使得开发者能够更加灵活地操作数据。在本项目...

    Java开发手册(嵩山版)灵魂15问.rar

    - **自定义注解**:元注解的使用,处理器的实现。 10. **JVM优化** - **内存模型**:堆、栈、方法区、本地方法栈等。 - **垃圾回收**:GC原理,新生代与老年代,垃圾收集器的选择。 - **JVM调优**:通过...

    spring2.0中文教程参考文档

    1. JPA支持:Spring 2.0开始支持Java Persistence API,提供了与ORM框架如Hibernate、EclipseLink等的集成。 2. JDBC抽象层:Spring的JdbcTemplate和SimpleJdbcTemplate提供了更高级别的数据库操作接口,减少了模板...

    995175.rar_Windows编程_Java_

    Hibernate是一个非常流行的Java对象关系映射(ORM)框架,它允许开发者用面向对象的方式操作数据库,从而减少了数据库操作的复杂性。在Java中,处理数据库通常涉及到编写大量的SQL语句,而Hibernate通过提供一个对象...

    spring2.5 官方文档

    - 对JDBC、Hibernate、JPA等持久层技术的支持更加完善,包括对ORM框架的整合和新的JdbcTemplate增强。 - 引入了`JdbcTemplate`和`SimpleJdbcTemplate`,简化了数据库操作。 8. **Web应用增强**: - `...

    spring2.0

    5. **Web MVC框架**:Spring Web MVC框架在2.0版本中得到加强,支持RESTful风格的URL设计、自定义视图解析器、本地化和主题处理,以及ModelAndView对象的改进,提升了Web应用的开发效率。 6. **MVC注解**:Spring ...

    2017年尚学堂Java培训课程大纲.docx

    - **视图解析器、自定义视图的概念及应用**:了解视图解析器的作用,实现自定义视图。 - **处理器方法的入参和返回值**:熟悉处理器方法参数的绑定和返回值的处理方式。 - **文件上传和下载**:实现文件的上传和下载...

Global site tag (gtag.js) - Google Analytics