今天我们来学习一个实用小功能,通过注解来实现自动生成sql查询语句。
话不多说直接上代码!
1.首先要创建两个注解,用来指定表名和字段名
package com.youyou.learn.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 数据库表注解
*
* @author 刘朋
* <br/>date 2019-12-16
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
String value();
}
package com.youyou.learn.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 数据库列注解
*
* @author 刘朋
* <br/>date 2019-12-16
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
String value();
}
2.创建两个实体类,并使用注解标注。
package com.youyou.learn.annotation;
@Table("t_student")
public class Student {
@Column("c_name")
private String name;
@Column("c_personCount")
private int personCount;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPersonCount() {
return personCount;
}
public void setPersonCount(int personCount) {
this.personCount = personCount;
}
}
package com.youyou.learn.annotation;
/**
* 数据表对象
*
* @author 刘朋
* <br/>date 2019-12-16
*/
@Table("ts_user")
public class User {
@Column("c_name")
private String name;
@Column("c_age")
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
3.创建sql生成工具类
package com.youyou.learn.annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 生成sql工具类
*
* @author 刘朋
* <br/>date 2019-12-16
*/
public class SqlUtil {
public static void main(String[] args) throws Exception {
User user = new User();
user.setName("张三");
user.setAge(3);
String sql = getSql(user);
System.out.println(sql);
Student student = new Student();
student.setName("刘备");
String sql2 = getSql(student);
System.out.println(sql2);
}
public static String getSql(Object user) throws Exception{
Class c = user.getClass();
//判断是否存在
boolean existTable = c.isAnnotationPresent(Table.class);
if (!existTable) {
return null;
}
//获取到注解
Table table = (Table) c.getAnnotation(Table.class);
//获取表名
String tableName = table.value();
StringBuilder sql = new StringBuilder();
sql.append("select * from ").append(tableName).append(" where 1=1");
//获取所有字段
Field[] declaredFields = c.getDeclaredFields();
for (Field declaredField : declaredFields) {
//判断注解是否存在
boolean existColumn = declaredField.isAnnotationPresent(Column.class);
if (!existColumn) {
continue;
}
Column column = declaredField.getAnnotation(Column.class);
//获取列名
String columnName = column.value();
//字段值
String name = declaredField.getName();
String methodName = "get" + name.substring(0, 1).toUpperCase() + name.substring(1);
Method method = c.getMethod(methodName);
Object value = method.invoke(user);
if(value instanceof String ){
sql.append(" and ").append(columnName).append("='").append(value).append("'");
}else if (value instanceof Integer){
sql.append(" and ").append(columnName).append("=").append(value);
}
}
return sql.toString();
}
}
测试结果如下:
测试成功!