解析注解:
通过反射获取类、函数或者成员运行时的注解信息,从而实现动态控制程序运行的逻辑。
根据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、结果
相关推荐
开发者可以在类、方法、变量等声明上添加注解,然后自定义注解处理器解析这些信息以执行特定的操作,比如代码生成、验证、持久化等。在ORM中,注解常用于标记需要映射的数据库字段和表信息。 3. 泛型(Generics):...
为了简化开发,可以创建一系列工具类,如DBUtil(数据库工具类)、AnnotationParser(注解解析器)、SQLGenerator(SQL生成器)等。这些工具类可以帮助开发者更高效地进行ORM相关的操作,如连接数据库、解析注解...
在这个名为“模拟hibernate注解功能”的项目中,我们将探讨如何利用自定义注解和反射技术来模仿Hibernate的注解功能。 首先,让我们理解一下Hibernate的注解。Hibernate支持JPA(Java Persistence API)标准,其中...
总之,"hibernate注解功能模拟"是一个综合性的学习项目,它涵盖了Java的高级特性以及ORM框架的核心思想。通过实践,你可以巩固和提升Java编程技能,同时对数据库管理和数据持久化有更深入的认识。
本项目旨在实现一个基于JDK5.0注解的小型ORM框架,模拟Hibernate的部分功能。 首先,我们要理解ORM的基本原理。ORM的核心思想是将数据库中的表映射为Java对象,将表中的记录映射为对象的实例,这样就可以通过操作...
Hibernate是一个开源的Java语言下的对象关系映射(ORM)框架,它为开发者提供了在Java应用程序中操作数据库的强大工具。通过Hibernate,开发者可以将数据库操作与业务逻辑解耦,使得代码更加面向对象,提高了开发...
EasyOrm是一个旨在简化Java开发中的对象关系映射(ORM)过程的框架,它借鉴了Hibernate和MyBatis的优秀特性,以提供一个轻量级、易于使用的解决方案。ORM框架的主要目的是将数据库操作与业务逻辑解耦,使得开发者...
1. **Hibernate框架**: Hibernate是Java中的一个开源ORM(对象关系映射)框架,它简化了数据库操作,通过将Java对象与数据库表映射,使得开发者可以避免编写大量的SQL语句。 2. **Oracle数据库**: Oracle是企业级的...
2. **Hibernate ORM**:Hibernate是一个强大的对象关系映射(ORM)工具,它可以将Java类与数据库表进行映射,简化了数据库操作。在这个实例中,Hibernate用于处理数据库交互,如CRUD(创建、读取、更新、删除)操作...
- **自定义注解**: 学会如何定义自定义注解以及如何使用它们。 - **内置注解**: 熟悉@Override、@Deprecated等注解的含义和使用场景。 **设计模式** - **单例模式**: 掌握单例模式的实现方法及其应用场景。 - **...
6. JPA(Java Persistence API):Java官方的持久化规范,提供了ORM的统一标准,通过注解或XML配置,可以实现对象与数据库表的自动映射。 7. 数据库事务:Java通过JDBC支持ACID(原子性、一致性、隔离性和持久性)...
通过实现HandlerInterceptor接口或者使用自定义注解+@AspectJ实现。 6. **配置**:Spring MVC的配置通常包括Spring的Context配置(如bean定义、依赖注入)和Spring MVC的DispatcherServlet配置(如视图解析器、拦截...
Hibernate ORM工具则与数据库进行交互,通过配置XML文件或注解,将Java类与数据库表进行映射。它提供了强大的查询语言HQL(Hibernate Query Language)和Criteria API,使得开发者能够更加灵活地操作数据。在本项目...
- **自定义注解**:元注解的使用,处理器的实现。 10. **JVM优化** - **内存模型**:堆、栈、方法区、本地方法栈等。 - **垃圾回收**:GC原理,新生代与老年代,垃圾收集器的选择。 - **JVM调优**:通过...
1. JPA支持:Spring 2.0开始支持Java Persistence API,提供了与ORM框架如Hibernate、EclipseLink等的集成。 2. JDBC抽象层:Spring的JdbcTemplate和SimpleJdbcTemplate提供了更高级别的数据库操作接口,减少了模板...
Hibernate是一个非常流行的Java对象关系映射(ORM)框架,它允许开发者用面向对象的方式操作数据库,从而减少了数据库操作的复杂性。在Java中,处理数据库通常涉及到编写大量的SQL语句,而Hibernate通过提供一个对象...
- 对JDBC、Hibernate、JPA等持久层技术的支持更加完善,包括对ORM框架的整合和新的JdbcTemplate增强。 - 引入了`JdbcTemplate`和`SimpleJdbcTemplate`,简化了数据库操作。 8. **Web应用增强**: - `...
5. **Web MVC框架**:Spring Web MVC框架在2.0版本中得到加强,支持RESTful风格的URL设计、自定义视图解析器、本地化和主题处理,以及ModelAndView对象的改进,提升了Web应用的开发效率。 6. **MVC注解**:Spring ...
- **视图解析器、自定义视图的概念及应用**:了解视图解析器的作用,实现自定义视图。 - **处理器方法的入参和返回值**:熟悉处理器方法参数的绑定和返回值的处理方式。 - **文件上传和下载**:实现文件的上传和下载...