先建两个注解 分别为 Table 和 Column

package com.hk.test;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
String value();
}

  

package com.hk.test;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
String value();
}

然后新建一个 bean 类 Filter.java (本类可根据自己需求更改,只要样式不变就好)

package com.hk.test;
@Table("user")
public class Filter {
@Column("id")
private int id;
@Column("user_name")
private String userName;
@Column("age")
private int age;
@Column("email")
private String email;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
} }

然后测试类

package com.hk.test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
*
* @author hk_z
* @deprecated 对类进行反射 获取注解和字段名 拼接成sql语句
* @version 0.1
*/
public class Test {
public static void main(String[] args) {
Filter f1 = new Filter();
f1.setId(10); Filter f2 = new Filter();
f2.setUserName("lucy"); //模糊查询 Filter f3 = new Filter();
f3.setEmail("zhangsan@qq.com,lisi@sina.com.cn"); //任意其一 String sql1 =query(f1);
System.out.println(sql1);
String sql2 =query(f2);
System.out.println(sql2);
String sql3 =query(f3);
System.out.println(sql3);
} private static String query(Filter f1) {
// TODO Auto-generated method stub
StringBuilder sb =new StringBuilder();
//1.获取到class
Class c = f1.getClass();
//2.获取到table 的名字
boolean exists = c.isAnnotationPresent(Table.class); //class 中有没有table的注解
if(!exists){
return null;
}
Table t= (Table)c.getAnnotation(Table.class);
String tableName = t.value(); //表名
sb.append("select * from ").append(tableName).append(" where 1 = 1");
//3.遍历所有的字段
Field[] fArray = c.getDeclaredFields();
for(Field field:fArray){
//4.处理每个字段对应的sql
//4.1 拿到字段名
boolean fExists = field.isAnnotationPresent(Column.class);
if(!fExists){
continue;
}
Column column = field.getAnnotation(Column.class);
String columnName = column.value(); //表里面字段的名字
//4.2拿到字段的值
String filedName = field.getName(); //变量的名字
String getMethodName = "get"+filedName.substring(0,1).toUpperCase()+filedName.substring(1);
Object fieldValue = null;
//拼装get方法 获取返回值 ;
try {
Method getMethod = c.getMethod(getMethodName); //反射
fieldValue = getMethod.invoke(f1); //反射调用 } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//4.3 拼装sql
if(fieldValue == null||(fieldValue instanceof Integer &&(Integer)fieldValue==0))
{
continue;
}
sb.append(" and ").append(filedName);
String [] val=null;
if(fieldValue instanceof String){ //字串型并且有逗号 进行拆分
if(((String)fieldValue).contains(",")){
val = ((String) fieldValue).split(",");
sb.append(" in(");
for(String v:val){
sb.append("'").append(v).append("'").append(",");
}
sb.deleteCharAt(sb.length()-1);
sb.append(")");
}
else{
sb.append(" = ").append("'").append(fieldValue).append("'");
}
}
else if(fieldValue instanceof Integer){
sb.append(" = ").append(fieldValue);
} }
return sb.toString();
}
}

java反射获取注解并拼接sql语句的更多相关文章

  1. Java自定义注解和运行时靠反射获取注解

    转载:http://blog.csdn.net/bao19901210/article/details/17201173/ java自定义注解 Java注解是附加在代码中的一些元信息,用于一些工具在编 ...

  2. java动态拼接sql语句并且执行时给sql语句的参数赋值

    问题 在这里举一个例子,比如我要做一个多条件模糊查询,用户输入的时候有可能输入一个条件,也有可能输入两个条件,这时执行查询的sql语句就不确定了,但可以用动态拼接sql语句来解决这个问题. 解决方法 ...

  3. JavaSE学习总结(十五)—— Java反射与注解

    一.静态语言与动态语言 静态类型语言:是指在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型,某些具有类型推导能力的现代语言可能能够部分减轻这个要求.强类型 动态 ...

  4. Java反射,注解,以及动态代理

    Java反射,注解,以及动态代理 基础  最近在准备实习面试,被学长问到了Java反射,注解和动态代理的内容,发现有点自己有点懵,这几天查了很多资料,就来说下自己的理解吧[如有错误,望指正] Java ...

  5. java后台获取和js拼接展示信息

    java后台获取和js拼接展示信息: html页面代码: <div class="results-bd"> <table id="activityInf ...

  6. StringBuilder 拼接sql语句比较快

    StringBuilder 拼接sql语句比较快StringBuilder strBuilder = new StringBuilder();strSql += "insert into t ...

  7. ASP.NET实现列表页连接查询 拼接sql语句 绑定grivdView

    ASP.NET实现列表页连接查询 拼接sql语句 如图效果: 基本需求:1.当页面第一次加载的时候默认查询一个月时间(或者说是登陆者所属权限的所有数据)的数据绑定到gridView 2.添加查询条件时 ...

  8. 查询拼接SQL语句,多条件模糊查询

    多条件查询,使用StringBuilder拼接SQL语句,效果如下: 当点击按钮时代码如下: private void button1_Click(object sender, EventArgs e ...

  9. Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别

    Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别 ​ 在工作中遇到一个问题,就是你需要去判断某个字符串是不是对象的某个成员属性名,然后根据判断结果 ...

随机推荐

  1. 浏览器操作html页面的width和height

    原文:http://www.cnblogs.com/dengshunping/archive/2009/06/15/1503803.html IE中: document.body.clientWidt ...

  2. iOS设计模式解析(五)责任链模式

    责任链模式:使多个对象都有机会处理请求,从而避免发送者和接受者之间发生耦合. 应用场景: 有多个对象可以处理请求,而处理程序只有在运行时才能确定 例如: 英雄联盟中伤害计算,伤害类型分为AP.AD.真 ...

  3. 去掉UItableview headerview黏性

    //去掉UItableview headerview黏性 - (void)scrollViewDidScroll:(UIScrollView *)scrollView { if (scrollView ...

  4. css样式规则的简要总结

    css与文档关联起来发挥作用. css文件中是各种样式规则,由选择器和声名块构成.声明块由多条声明组成.选择器是声明要作用的对象,声明是对具体规则的描述. 声明由属性和值组成,值或是属性的错误都会使该 ...

  5. Subsets,Subsets II

    一.Subsets Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a s ...

  6. C++中的namespace

    本文转载来自:http://blog.csdn.net/yao_zhuang/article/details/1853625 namespace中文意思是命名空间或者叫名字空间,传统的C++只有一个全 ...

  7. 设计模式之适配器模式(Decorator)

    1.意图 动态地给一个对象添加一些额外的功能. 2.适用性 动态.透明的方式给单个对象添加职责. 如果不适合适用子类来进行扩展的时候,可以考虑适用装饰模式. 避免子类数目爆炸性增长. 3.结构 4.参 ...

  8. Android_BitmapShader实现圆形、圆角图片

    转:http://blog.csdn.net/lmj623565791/article/details/41967509,本文出自:[张鸿洋的博客] 1.概述 记得初学那会写过一篇博客Android ...

  9. c#访问各数据库的providerName各驱动

    在machine.config(C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/CONFIG)文件中有这么一段: <system.data> & ...

  10. js关闭当前页面/关闭当前窗口/移动端 代码

    var userAgent = navigator.userAgent; if (userAgent.indexOf("Firefox") != -1 || userAgent.i ...