极简版ORM框架
1. 概述
- 实现
@Table
、@Column
注解 - 利用反射机制,解析对象,动态生成SQL语句
2. 注解实现
2.1 @Table注解
package com.zipeng.annotation;
import java.lang.annotation.*;
@Inherited
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Table {
String value() default "";
}
2.2 @Column注解
package com.zipeng.annotation;
import java.lang.annotation.*;
@Inherited
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Column {
String value() default "";
}
3. 自定义解析器
import com.zipeng.annotation.Table;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class AnnotationParser {
public static String assembleSqlFromObj(Object obj){
Table tableAnnotation = obj.getClass().getAnnotation(Table.class);
StringBuffer sbSql = new StringBuffer();
String tableName = tableAnnotation.value();
sbSql.append("select * from " + tableName + " where 1=1 ");
Field[] fields = obj.getClass().getDeclaredFields();
for(Field f: fields){
String fieldName = f.getName();
String methodName = "get" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1);
Column columnAnnotation = f.getAnnotation(Column.class);
if(columnAnnotation != null){
Object invoke = null;
try {
Method method = obj.getClass().getMethod(methodName);
invoke = method.invoke(obj);
} catch (Exception e) {
e.printStackTrace();
}
sbSql.append("and " + columnAnnotation.value() + "='" + invoke.toString() + "' ");
}
}
return sbSql.toString();
}
}
4. 测试
package com.zipeng;
import com.zipeng.annotation.parser.AnnotationParser;
import com.zipeng.entity.User;
public class Test {
public static void main(String[] args) {
User user = new User("123", "小蓝");
String s = AnnotationParser.assembleSqlFromObj(user);
System.out.println(s);
User user01 = new User("12321", "欢欢");
String str = AnnotationParser.assembleSqlFromObj(user01);
System.out.println(str);
}
}
select * from t_user where 1=1 and id='123' and name='小蓝'
select * from t_user where 1=1 and id='12321' and name='欢欢'
后序
- 我是一名大三本科生,专业是软件工程【一本】。目前,正在准备找实习以及秋招,意向岗位是Java后端开发工程师。为此,在码云托管了一个项目,以整理我所有所学知识。涉及内容:计算机网络、操作系统、Java基础、主流Java后端框架、设计模式、Web前端框架等内容。欢迎大家访问我的开源项目编程之路
- 码云地址:https://gitee.com/alizipeng/the-way-of-programming
- 以上内容均记载在我的开源项目中