参考:蚂蚁课堂
创建需要使用到的注解
创建表名称注解
定义表名
// 限制描述类(可加可不加)
@Target(value = { ElementType.TYPE })
// 描述注解的生命周期
@Retention(RetentionPolicy.RUNTIME)
public @interface SetTable {
// 对应数据库表名
String value();
}
创建表属性注解
定义字段名称和字段长度
@Retention(RetentionPolicy.RUNTIME)
public @interface SetProperty {
// 字段名称
String name();
// 字段长度
int len();
}
使用注解创建实体类
把类的 名称、属性 通过注解对应 表名、类名
package com.ymk.test.annotation;
@SetTable("user_table")
public class UserEntity {
@SetProperty(name = "user_name", len = 10)
private String userName;
@SetProperty(name = "user_age", len = 10)
private Integer userAge;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getUserAge() {
return userAge;
}
public void setUserAge(Integer userAge) {
this.userAge = userAge;
}
}
模拟ORM
通过反射获得类,再获取类的注解属性,通过StringBuffer拼接sql语句
模拟 Mybatis 中 select 语句的拼接
public static void main(String[] args) throws ClassNotFoundException {
// 反射
Class<?> forName = Class.forName("com.ymk.test.annotation.UserEntity");
Field[] declaredFields = forName.getDeclaredFields();
// 拼接sql语句
StringBuffer sqlBuffer = new StringBuffer();
sqlBuffer.append(" select ");
for (int i = 0; i < declaredFields.length; i++) {
// 获取注解属性
SetProperty setProperty = declaredFields[i].getAnnotation(SetProperty.class);
String property = setProperty.name();
sqlBuffer.append(property);
if (i == declaredFields.length - 1) {
sqlBuffer.append(" from ");
} else {
sqlBuffer.append(" , ");
}
}
// 获取某个注解对象
SetTable setTable = forName.getAnnotation(SetTable.class);
// 表的名称
String tableName = setTable.value();
sqlBuffer.append(" " + tableName);
// 生成orm框架sql语句
System.out.println(sqlBuffer.toString());
}
拼接后的sql语句:
select user_name , user_age from user_table