利用注解构建简单ORM框架
描述,一般Java规范编程(只是一种习惯,而不是强制)中,实体类的命名方式一般采用驼峰式命名。比如userName,userAge。但是在数据库中一般不会采用驼峰式,而是采用下划线_的方式,比如user_name,user_age,这里就利用自定义注解的方式去进行一个转换。
注解分为两种:JDK自带注解和自定义注解,这里利用反射去构建SQL语句
反射原理(IOC为例):通过类的全路径得到class,然后通过配置文件拿到bean,然后设置属性值。
反射的常用场景:
Java JDBC连接驱动
Spring IOC
一些常用的框架
首先新建一个java项目 zhujieTest(ORM)
新建包 per.lx
然后新建两个注解 Table(将实体类注解为表) 和Col(变量注解为列)
新建方式如下
在Table.java注解中代码如下
//这个注解是jdk自带注解表示可以使用反射
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
//name参数
String name();
}
在Col.java中的代码
//这个注解是jdk自带注解表示可以使用反射
@Retention(RetentionPolicy.RUNTIME)
public @interface Col {
//name参数
String name();
}
编写一个UserEntity实体类去使用这两个注解
UserTntity.java
//注解时传入需要的name
@Table(name="users")
public class UserEntity {
//注解时传入需要的name
@Col(name="user_name")
private String userName;
@Col(name="user_age")
private int userAge;
}
然后我们就可以在Main函数中去利用这些注解进行反射得到我们想要的SQL语句了,这里只简单的写一个查询的语句,具体的其他语句类似
Main.java
public class Main {
public static void main(String[] args) throws ClassNotFoundException {
// 通过实体类的全路径拿到类的class字节码
Class<?> forName = Class.forName("per.lx.UserEntity");
// 拿到类的成员属性
Field[] declaredFields = forName.getDeclaredFields();
StringBuffer sb = new StringBuffer();
sb.append("select ");
// 遍历成员属性
for (int i = 0; i < declaredFields.length; i++) {
// 拿到注解
Col col = declaredFields[i].getDeclaredAnnotation(Col.class);
//获取注解中的name值
String col_name = col.name();
sb.append(col_name);
if(i == declaredFields.length-1) {
sb.append(" from ");
}else {
sb.append(" , ");
}
}
// 拿到Table注解
Table table = forName.getAnnotation(Table.class);
// Table注解的name值
String table_name = table.name();
sb.append(table_name);
System.out.println(sb.toString());
}
}
运行执行完毕,控制台打印如下结果表示利用注解反射生成SQL语句成功。有时间的朋友可以自己实现增删改查的功能,无非就是把生成过程提出来然后传一些需要修改和指定的值进行操作。亲测成功