java反射获取注解并拼接sql语句
先建两个注解 分别为 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语句的更多相关文章
- Java自定义注解和运行时靠反射获取注解
转载:http://blog.csdn.net/bao19901210/article/details/17201173/ java自定义注解 Java注解是附加在代码中的一些元信息,用于一些工具在编 ...
- java动态拼接sql语句并且执行时给sql语句的参数赋值
问题 在这里举一个例子,比如我要做一个多条件模糊查询,用户输入的时候有可能输入一个条件,也有可能输入两个条件,这时执行查询的sql语句就不确定了,但可以用动态拼接sql语句来解决这个问题. 解决方法 ...
- JavaSE学习总结(十五)—— Java反射与注解
一.静态语言与动态语言 静态类型语言:是指在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型,某些具有类型推导能力的现代语言可能能够部分减轻这个要求.强类型 动态 ...
- Java反射,注解,以及动态代理
Java反射,注解,以及动态代理 基础 最近在准备实习面试,被学长问到了Java反射,注解和动态代理的内容,发现有点自己有点懵,这几天查了很多资料,就来说下自己的理解吧[如有错误,望指正] Java ...
- java后台获取和js拼接展示信息
java后台获取和js拼接展示信息: html页面代码: <div class="results-bd"> <table id="activityInf ...
- StringBuilder 拼接sql语句比较快
StringBuilder 拼接sql语句比较快StringBuilder strBuilder = new StringBuilder();strSql += "insert into t ...
- ASP.NET实现列表页连接查询 拼接sql语句 绑定grivdView
ASP.NET实现列表页连接查询 拼接sql语句 如图效果: 基本需求:1.当页面第一次加载的时候默认查询一个月时间(或者说是登陆者所属权限的所有数据)的数据绑定到gridView 2.添加查询条件时 ...
- 查询拼接SQL语句,多条件模糊查询
多条件查询,使用StringBuilder拼接SQL语句,效果如下: 当点击按钮时代码如下: private void button1_Click(object sender, EventArgs e ...
- Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别
Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别 在工作中遇到一个问题,就是你需要去判断某个字符串是不是对象的某个成员属性名,然后根据判断结果 ...
随机推荐
- memcached 内存管理 分析(转)
Memcached是一个高效的分布式内存cache,了解memcached的内存管理机制,便于我们理解memcached,让我们可以针对我们数据特点进行调优,让其更好的为我所用.这里简单谈一下我对me ...
- java整体集合框架
1.关于集合的两道面试题 先来看几道题目: 1.创建一个不可变的的集合: public static void main(String[] args) { Set<String> set ...
- java后台获取国际化资源文件
//current属性,由于此属性只做赋值操作,不做取值操作,因此没有get方法 private Locale current; public void setCurrent(Locale cur) ...
- 存储、读取——Android应用程序内置的文件夹
1.将数据存储到应用程序的文件夹,并读写 Context提供了两个方法,打开应用程序文件夹的I/O,若文件不存在则创建 FileInputStream openFileInputStream(Stri ...
- Python命令行参数sys.argv[]
学习C语言的时候就没弄明白命令行参数的用法,在学习Pyton 的时候又遇到了命令行参数,在这里稍微学习了一下,稍微明白了一些在这里做个记录方便后面回顾复习. Sys.argv[]是用来获取命令行参数的 ...
- python---__getattr__\__setattr_重载'.'操作
#!coding:utf-8 class Person(object): def __init__(self,id): #定义一个名为ID的属性 self.ID=id def __getattr__( ...
- SQL Server 创建数据库快照
创建数据库快照: 必须在create database 命令中包括源数据库的每一个数据文件,原始逻辑名,新物理名与路径, 不能指定其他属性 create database db_snapshot_na ...
- 了解单位em和px的区别
这里引用的是Jorux的“95%的中国网站需要重写CSS”的文章,题目有点吓人,但是确实是现在国内网页制作方面的一些缺陷.我一直也搞不清楚px与em之间的关系和特点,看过以后确实收获很大.平时都是用p ...
- Congos
http://hi.baidu.com/tag/cognos%E7%B3%BB%E7%BB%9F%E7%AE%A1%E7%90%86/feeds http://www.blogjava.net/mlh ...
- linux中fork创建进程讲解(转)
大家知道Linux中创建子进程的一个很好的方法是函数调用fork,但是很多初学者对fork的理解上可能有点困难.我们举个例子来看看fork的用法吧. 大家用fork的时候记住fork是 ...