标签:interface declare column struct user pac oat 语句 SQ
注解介绍:
java SE5内置了三种,定义在java.lang中的注解:
@Override,表示当前的方法定义将覆盖超类中的方法。
@Deprecated,如果程序员使用了注解为它的元素,那么编译器会发出警告信息。
@SuppressWarnings,关闭不当的编译器警告信息。
元注解
@Target 用来定义你的注解应用于什么地方,例如是一个方法或者一个域。
CONSTRUCTOR :构造器的声明
FIELD : 域声明
METHOD :方法声明
PACKAGE : 包生明
TYPE : 类、接口或enmu声明
@Retention 用来定义该注解在哪一个级别可用,在源代码中(SOURCE),类文件中(CLASS)或者运行时(RUNTIME)
@Documented 将此注解包含在javadoc中
@Inherited 允许子类继承父类中的注解
注解元素可用的类型,所有的基本类型:int,float,boolean等、String、Class、enum、Annotation
定义一个注解Test:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test(){
String value();
}
// 下面使用注解来生成sql语句
1、先定义2个注解类,Table,Column
2、定义一个JavaBean类
3、编写注解实现类
注解类:Table
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
String value();
}
注解类:Column
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
String value();
}
javaBean类
@Table(value = "USER")
public class UserBean {
@Column(value = "id")
private int id;
@Column(value = "userId")
private String userId;
@Column(value = "userName")
private String userName;
@Column(value = "email")
private String email;
@Column(value = "mobile")
private String mobile;
@Column(value = "phone")
private String phone;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
4、注解测试类
public class MainTest {
public static void main(String[] args) {
UserBean userBean = new UserBean();
userBean.setId(10);
userBean.setEmail("123@qq.com");
beanSql(userBean);
}
public static String beanSql(Object user){
StringBuffer sql = new StringBuffer();
Class c = user.getClass();
boolean flag = c.isAnnotationPresent(Table.class); // 判断该类是否包含Table的注解,返回true/false
if(!flag){
return null;
}
Table table = (Table) c.getAnnotation(Table.class); // 获取到注解对象
String tableName = table.value(); // 获取到注解对象的值
sql.append("select * from ").append(tableName).append(" where 1=1");
// 获取该类中字段的注解
//Field[] fields = c.getFields();
Field[] fields = c.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
boolean fieldFalg = fields[i].isAnnotationPresent(Column.class);
if(!fieldFalg){
continue;
}
Column column = fields[i].getAnnotation(Column.class);
String fieldName = column.value(); // 字段的名称
Object fieldValue = null ; // 字段的值
// 字段的值获取,使用反射
try {
// 获取方法名如:getId()
String methodName = "get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1).toString();
// 通过反射invoke获取到值
Method method = c.getMethod(methodName);
fieldValue = method.invoke(user,null);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
if(fieldValue == null || (fieldValue instanceof Integer && (Integer)fieldValue == 0)){
continue;
}
if(fieldValue instanceof String){
sql.append(" and ").append(fields[i].getName()).append("=‘").append(fieldValue).append("‘");
}else if(fieldValue instanceof Integer){
sql.append(" and ").append(fields[i].getName()).append("=").append(fieldValue);
}
}
System.out.println(sql.toString());
return sql.toString();
}
}
生成sql如下:
select * from USER where 1=1 and id=10 and email=‘123@qq.com‘;
方法说明: getAnnotation(Table.class):检查对象是否带有@Table注解 getFields() : 获得某个类的所有的公共(public)的字段,包括父类。 getDeclaredFields() :获得某个类的所有申明的字段,即包括public、private和proteced,但是不包括父类的申明字段
isAnnotationPresent(Table.class): 指定注释类型的注释存在于此元素上
标签:interface declare column struct user pac oat 语句 SQ
原文地址:https://www.cnblogs.com/zhangcece/p/8997769.html