思路:
思路:
- 定义Table及Column注解,用于失血模型与表之间的绑定
- 定义好失血模型,并利用Table和Column注解完成与表之间的绑定
- 利用反射获取表名,并完成SQL语句:select * from 表名;
- 提示:表名为失血模型类上的Table注解的属性值
- 利用反射获取到被Column注解修饰了的所有属性的值,如果值为该属性类型的默认值,
则该属性不作为SQL查询条件,否则,则取出该属性对应的列名,完成SQL语句:select *
from 表名 where 列名=”属性值”and ……;
Table 注解:
package com.woniuxy.sqlpractice;
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 tableName();
}
Column 注解:
package com.woniuxy.sqlpractice;
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 key();
}
失血模型:
package com.woniuxy.sqlpractice;
// 失血模型,用于接收数据库数据
@Table(tableName = "UserPo")
public class UserPO {
@Column(key = "id")
private Integer id;
@Column(key = "userName")
private String userName;
@Column(key = "userPass")
private String userPass;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPass() {
return userPass;
}
public void setUserPass(String userPass) {
this.userPass = userPass;
}
}
绑定
package com.woniuxy.sqlpractice;
import java.lang.reflect.Field;
public class SQLPractice {
public static void main(String[] args) {
UserPO po = new UserPO();
po.setId(11);
po.setUserName("null");
System.out.println(SQLSelect(po, UserPO.class));
}
public static String SQLSelect(Object obj, Class<UserPO> cl) {
int i = 0;
String result = "SELECT * FROM ";
// System.out.println("1:"+cl.isAnnotationPresent(Table.class));
// 通过注解获取表名
if (cl.isAnnotationPresent(Table.class)) {
Table table = (Table) cl.getAnnotation(Table.class);
result += table.tableName();
}
// 遍历表中所有属性
Field[] fields = cl.getDeclaredFields();
// System.out.println(fields.length > 0);
for (Field field : fields) {
// 判断属性上面是否有 Column 的注解
// System.out.println("2:"+field.isAnnotationPresent(Column.class));
if (field.isAnnotationPresent(Column.class)) {
// 设置突破访问
field.setAccessible(true);
try {
if (field.get(obj) != null) {
if (i == 0) {
result += " WHILE ";
i++;
} else {
result += " AND ";
}
String value = field.get(obj) + "";
// 获取注解值
String key = field.getAnnotation(Column.class).key();
result += "`" + key + "`" + "=" + value;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
return result;
}
}
结果
结果.png