使用Java反射(Reflect)、自定义注解(Customer Annotation)生成简单SQL语句

  • 时间:
  • 浏览:1

    2.ElementType.FIELD:用于描述域

private int userId;

sb.append(")");

@Retention( RetentionPolicy.RUNTIME)//有效期为运行时

try {

 */

 *  @Column("userId")

user1.setUserId(1);//根据Id查询

}

public void setUserName(String userName) {

package com.demo.ann;

public String getPassWord() {

}

/**

 */

}

String sql2 = executeQuery(user2);

 * @author xg.qiu

 * @author xg.qiu

user3.setUserName("xiaoqiu");

 * ClassName:User.java

if(!isExist){

boolean isFExist = f.isAnnotationPresent(Column.class);

 *  1.根据id查询

  @Inherited :元注解是一两个多 多标记注解,@Inherited阐述了某个被标注的类型是被继承的

  @Retention :@Retention定义了该Annotation被保留的时间长短

 * ClassName:Column.java

 * Aug 3, 2015

//3.2、拿到字段值

User user4 = new User();

 * 测试:使用自定义注解完成数据库的查询返回sql一段话

}

System.out.println(sql3);

import com.demo.ann.anns.Column;

String value();

 * 自定义注解:列

}

}

                // 返回拼装好的sql一段话 

user2.setUserName("xiaoqiu");// 根据用户名查询

    4.ElementType.METHOD:用于描述最好的法律法律法律依据

try {

                                // 自定义异常

 */

String sql1 = executeQuery(user1);

public @interface Column {

//3.4、.拿到字段值

private String userName;

return userId;

continue;

    3.RetentionPolicy.RUNTIME:在运行时有效(即运行时保留)

String sql4 = executeQuery(user4);

}

}

    7.ElementType.TYPE:用于描述类、接口(包括注解类型) 或enum声明

    3.ElementType.LOCAL_VARIABLE:用于描述局部变量

}

 * @author xg.qiu

 * 

}else if(values instanceof String){

@Column("USER_NAME")

System.out.println(sql2);

import java.lang.reflect.Method;

   否则都需用被之类javadoc此类的工具文档化。

 */

Column column = f.getAnnotation(Column.class);

 * ClassName:Table.java

} catch (Exception e) {

                                 // 打印堆栈信息 

 * 用法:

user4.setUserName("xiaoqiu,zasang,lisi");

  取值(RetentionPoicy)有:

 *  @Table("user")

this.passWord = passWord;

import java.lang.annotation.Target;

User user1 = new User();

 *  3.根据用户名、密码组合查询

    6.ElementType.PARAMETER:用于描述参数

boolean isExist = c.isAnnotationPresent(Table.class);

   [需用是extend class 而全部都有implements interface]

 */

if(!isFExist){

}

@Column("PASS_WORD")

}

          * @param user 用户对象

          *@return String 返回的是拼装好的sql一段话

user3.setPassWord("123456");// 根据用户名、密码组合查询

import com.demo.ann.anns.Column;

return passWord;

}

 * 

}

public void setUserId(int userId) {

//2、查找类与非 被注解

import java.lang.annotation.ElementType;

}

this.userId = userId;

return sb.toString();

import java.lang.annotation.Retention;

Table table = (Table) c.getAnnotation(Table.class);

String columnName = column.value();

package com.demo.ann.anns;

sb.append("='").append(values).append("'");

throw new AnnException("the " + f.getName()  +" field is not used annotation");

return age;

String sql3 = executeQuery(user3);

 * @since JDK1.7

}

                        // 获取列注解 

if(values instanceof Integer){

@Target( ElementType.FIELD)//作用于属性

@Column("AGE")

Object values = null;

/**

    解析注解并返回执行的sql一段话 

try {

}

sb.append(s).append("'").append(",");

 * 

public int getAge() {

 * Aug 3, 2015

private int age;

this.userName = userName;

 * 自定义注解:表

 *  2.根据用户名查询

//3、查找属性与非 被注解

 *  public class User

@Table("TABLE_USER")

public @interface Table {

//3.5.拼装sql

}

 */

}

for(String s : valuesIn){

 * @since JDK1.7

//1、获取类

if( values == null || ( values instanceof Integer && (Integer) values == 0) ){

 * ClassName:Test.java

import com.demo.ann.anns.Table;

通常许多人使用自定义注解一般使用4中元注解即:

 */

User user3 = new User();

import java.lang.annotation.RetentionPolicy;

@Column("USER_ID")

System.out.println(sql4);

package com.demo.ann.anns;

 */

} catch (AnnException e) {

/**

import com.demo.ann.anns.Table;

    1.ElementType.CONSTRUCTOR:用于描述构造器

sb.append("=").append(values);

String value();

throw new AnnException("the "+ c.getClass().getName() +" class is not used annotation");

User user2 = new User();

 * Aug 3, 2015

String getFieldMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);

 * 取值(ElementType)有:

    5.ElementType.PACKAGE:用于描述包

 * ClassName:package-info.java

return userName;

public class Test {

System.out.println(sql1);

@Retention( RetentionPolicy.RUNTIME)// 有效期为运行时

} catch (AnnException e) {

 * 使用自定义注解:

 * 

   Documented是一两个多 多标识注解,这么 成员。

sb.deleteCharAt(sb.length() - 1);

 * @Target :用于描述注解的使用范围(即:被描述的注解都需用用在那些地方)

}

/**

/**

}

public static void main(String[] args) {

 * @since JDK1.7 Aug 3, 2015

/**

import java.lang.reflect.Field;

sb.append( table.value() +" where 1= 1");

public void setPassWord(String passWord) {

sb.append(" and ").append(columnName);

}else{

package com.demo.ann;

import java.lang.annotation.Target;

e.printStackTrace();

          */

 *  private int userId;

 * 用法:

this.age = age;

e.printStackTrace();

import com.demo.ann.exception.AnnException;

 * @author xg.qiu

import java.lang.annotation.Retention;

@Target( ElementType.TYPE)// 作用域 类或接口

 */

import java.lang.annotation.ElementType;

package com.demo.ann;

//3.1、除理每个字段对应的sql

for(Field f : fields){

/**

 * Aug 3, 2015

 * @since JDK1.7

}

                // 获取Table注解 

sb.append(" in('");

/**

    1.RetentionPolicy.SOURCE:在源文件所含效(即源文件保留)

StringBuffer sb = new StringBuffer("select * from ");

 * 

/**

    2.RetentionPolicy.CLASS:在class文件所含效(即class保留)

private static String executeQuery(User user) {

//3.2、获取字段

String [] valuesIn = ((String) values).split(",");

Class<? extends User> c = user.getClass();

values = getMethod.invoke(user);

private String passWord;

}

}

String fieldName = f.getName();

public class User {

 * @author xg.qiu

public void setAge(int age) {

Method getMethod = c.getDeclaredMethod(getFieldMethodName);

public String getUserName() {

if( ((String) values).contains(",")){

public int getUserId() {

/**

 */

e.printStackTrace();

 * 

  @Documented:用于描述其它类型的annotation应该被作为被标注的应用应用程序成员的公共API,

         /**

 * @since JDK1.7

Field[] fields = c.getDeclaredFields();

import java.lang.annotation.RetentionPolicy;