首先我们定义好两个接口注解:
这个注解是用于定义在实体对象中用的
package homework4.exp3;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Retention(RUNTIME)
@Target(FIELD)
public @interface Column {
//是否为主键
boolean isPK() default false;
//对应的数据库的字段名,默认为空
String label() default "";
}
这个注解是用于定义到Entity实体对象用的
package homework4.exp3;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Retention(RUNTIME)
@Target(TYPE)
public @interface Entity {
//表名
String tableName();
//备注的标识
String label();
}
定义Entity对象,并且使用上面的两个接口的注解
package homework4.exp3;
@Entity(tableName = "teacher",label = "教师")
public class Teacher {
@Column(isPK = true,label = "id")
private String id;
@Column(label = "name")
private String name;
@Column(label = "school")
private String school;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
}
具体实现CRUD的Sql语句自动生成代码如下 划重点↓↓↓↓↓
package homework4.exp3;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class generateSQL {
public static void main(String[] args) {
Teacher teacher = new Teacher();
generateSQL generateSQL= new generateSQL();
teacher.setId("1");
teacher.setSchool("zhku");
teacher.setName("Adams");
String str1 = generateSQL.selectSQL(teacher.getClass());
System.out.println("输出的SELECT的sql:" + str1);
String str2 = generateSQL.deleteSQL(teacher.getClass(), teacher);
System.out.println("输出的DELETE的sq2:" + str2);
String str3 = generateSQL.insertSQL(teacher.getClass(), teacher);
System.out.println("输出的INSERT的sq3:" + str3);
String str4 = generateSQL.updateSQL(teacher.getClass(), teacher);
System.out.println("输出的UPDATE的sq4:" + str4);
}
//生成select的sql语句,
public String selectSQL(Class<?> clazz) {
StringBuilder str = new StringBuilder();
String tableName = getTableName(clazz);
str.append("select * from ").append(tableName);
String resultStr = str.toString();
return resultStr;
}
//生成delete的sql语句
public String deleteSQL(Class<?> clazz, Object object) {
StringBuilder str = new StringBuilder();
String tableName = getTableName(clazz);
str.append("delete from ").append(tableName).append(" where ");
Field[] fields = clazz.getDeclaredFields();
String pk = "";
for (int i = 0; i < fields.length; i++) {
Column column = fields[i].getAnnotation(Column.class);
if (column.isPK()) {
pk = column.label();
break;
}
}
try {
str.append(pk).append(" = ").append(getValue(pk, object));
} catch (Exception e) {
e.printStackTrace();
}
String resultStr = str.toString();
return resultStr;
}
//生成insert的sql语句
public String insertSQL(Class<?> clazz, Object object) {
StringBuilder str = new StringBuilder();
String tableName = getTableName(clazz);
str.append("insert into ").append(tableName).append(" (");
Field[] fields = clazz.getDeclaredFields();
for (int i = 0; i < fields.length - 1; i++) {
Column column = fields[i].getAnnotation(Column.class);
str.append(column.label()).append(" , ");
}
Column columns = fields[fields.length - 1].getAnnotation(Column.class);
str.append(columns.label()).append(") values(");
try {
for (int i = 0; i < fields.length - 1; i++) {
Column column = fields[i].getAnnotation(Column.class);
str.append(getValue(column.label(), object)).append(" , ");
}
str.append(getValue(columns.label(),object)).append(")");
} catch (Exception e) {
e.printStackTrace();
}
String resultStr = str.toString();
return resultStr;
}
//生成update的sql语句
public String updateSQL(Class<?> clazz, Object object) {
StringBuilder str = new StringBuilder();
String tableName = getTableName(clazz);
str.append("update ").append(tableName).append(" set ");
Field[] fields = clazz.getDeclaredFields();
String pk = "";
try {
for (int i = 0; i < fields.length - 1; i++) {
Column column = fields[i].getAnnotation(Column.class);
if (column.isPK()) {
pk = column.label();
} else {
str.append(column.label()).append(" = ").append(getValue(column.label(), object)).append(",");
}
}
Column columns = fields[fields.length - 1].getAnnotation(Column.class);
str.append(columns.label()).append(" = ").append(getValue(columns.label(), object)).append(" ");
str.append(" where ").append(pk).append(" = ").append(getValue(pk, object));
} catch (Exception e) {
e.printStackTrace();
}
String resultStr = str.toString();
return resultStr;
}
//获取表的名称
private String getTableName(Class<?> clazz) {
//判断是否为Table注释类型是方法返回true,否则返回false
if (clazz.isAnnotationPresent(Entity.class)) {
//获取注解信息
Entity table = clazz.getAnnotation(Entity.class);
if (!"".equals(table.tableName())) {
return table.tableName();
}
}
return null;
}
//通过对象的值,来获取实际的值
private <T> String getValue(String columnName, Object object) throws Exception {
//获取相应字段的getXXX方法
String getMethod = columnName.substring(0, 1).toUpperCase() + columnName.substring(1);
Method method = object.getClass().getMethod("get" + getMethod);
return method.invoke(object).toString();
}
}
最后运行结果:
本文参考自: Java通过反射注解生成对应的sql语句