周边有许多同事只会使用注解,并不了解注解的原理。于是随手写一个小Demo,普及下注解的使用原理,顺便加深自己的理解。如有错误,欢迎大牛指正。
/**
*
* @author qpf
* 此注解用于对表名的设置
*
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
String value();
}
|
@Table("StudentInfo")
public class StudentInfo extends BaseTable
{
//学生姓名
@Column("name")
private String name;
//性别
@Column("sex")
private String sex;
}
2、利用注解,对表实例的每个字段进行检查,并打印出查询sql

/**
*
* @author qpf
* 此注解用于对表字段的设置
*/
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
String value();
}
/**
*
* @author qpf
* 此注解用于对表名的设置
*
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
String value();
}
下面的代码删去了get和set方法。
/**
*
* @author qpf
* Table标签里为表名
* Column标签里为数据库字段名
*/
@Table("StudentInfo")
public class StudentInfo extends BaseTable
{
//学生姓名
@Column("name")
private String name;
//性别
@Column("sex")
private String sex;
//年级
@Column("grade")
private String grade;
//班级
@Column("class_num")
private String classNum;
//班主任
@Column("teacher")
private String teacher;
//总分
@Column("total_scores")
private String totalScores;
//微信号
@Column("weChat_num")
private String weChatNum;
//手机号
@Column("tel_num")
private String telNum;
//父亲名
@Column("father_name")
private String fatherName;
//母亲名
@Column("mother_name")
private String motherName;
}
public class AnnotationTest {
/**
* 需求设计:
* 1、有一张学生信息表,字段包括姓名,年级,班级,教师名,性别等;
* 2、利用注解,对每个字段的组合条件进行检查,并打印出sql
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
StudentInfo studentInfo=new StudentInfo();
studentInfo.setName("Tom");
studentInfo.setSex("men");
studentInfo.setTelNum("18255005147,18255005148,18255005149");
studentInfo.setWeChatNum("qpf123456");
String sql=querySql(studentInfo);
System.out.println((sql==null)?"":sql);
}
public static String querySql(BaseTable table)
{
//获取类加载器
Class<?> cTable=table.getClass();
//判断类中是否包含Table的注解
boolean tableIsExists=cTable.isAnnotationPresent(Table.class);
//判断是否为表实例
if(!tableIsExists)
{
return null;
}
//获取表名
String tableName=cTable.getAnnotation(Table.class).value();
//初始化表查询语句
StringBuilder builder=new StringBuilder("select * from");
builder.append(" "+tableName+" where 1=1");
//获取表实例中的所有字段
Field[] fields=cTable.getDeclaredFields();
try
{
for (Field field : fields)
{
//判断是否为表数据字段
boolean columnIsExist=field.isAnnotationPresent(Column.class);
if(!columnIsExist)
{
continue;
}
//判断表数据字段的值是否为null
field.setAccessible(true);
String fieldValue=(String)field.get(table);
if(null==fieldValue || "".equals(fieldValue))
{
continue;
}
//检测到需要拼接字段时,再获取数据库字段名
String columnName=field.getAnnotation(Column.class).value();
//需要用in的字段处理
if(fieldValue.contains(","))
{
builder.append(" and "+columnName+" in(");
String[] strs=fieldValue.split(",");
for (int i = 0; i < strs.length; i++)
{
builder.append("‘"+strs[i]+"‘");
if(i!=strs.length-1)
{
builder.append(",");
}
}
builder.append(")");
}
else
{
builder.append(" and "+columnName+"="+"‘"+fieldValue+"‘");
}
}
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return builder.toString();
}
}
上面方法打印出的查询sql语句为:
select * from StudentInfo where 1=1 and name=‘Tom‘ and sex=‘men‘ and weChat_num=‘qpf123456‘ and tel_num in(‘18255005147‘,‘18255005148‘,‘18255005149‘)
原文:https://www.cnblogs.com/qpf1/p/9161690.html