先建两个注解 分别为 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();
}
}

最新文章

  1. jsonp 使用总结
  2. Jquery DIV滚动至浏览器顶部后固定不动代码
  3. 使用getopt函数对windows命令行程序进行参数解析
  4. linux中查看硬件温度的命令
  5. ADO.NET 对象 结构图
  6. 通过.NET实现后台自动发送Email功能的代码示例
  7. Java中的局部内部类
  8. 手把手教你webpack、react和node.js环境配置(下篇)
  9. .NET Core阿里大于短信发送SDK修改以及使用
  10. 使用 memoryview 和 struct 查看一个 GIF 图像的首部
  11. 阿里云学生服务器搭建网站-Ubuntu16.04安装php开发环境
  12. week3
  13. linux 软件应用
  14. c++ cmath头文件
  15. RHEL7.3安装python3.6.1
  16. [React] Use React.ReactNode for the children prop in React TypeScript components and Render Props
  17. 关于xml里的encoding
  18. Robotium测试套管理测试用例
  19. MS17-010 EternalBlue SMB Remote Windows Kernel Pool Corruption 2017-05-18 16:45
  20. sourceinsight使用技巧

热门文章

  1. Equal 和==比较
  2. oracle 定义数据完整性
  3. 全站 HTTPS
  4. Ubuntu package managerment tools
  5. 自定义TabHost,TabWidget样式
  6. 博士论文》》》 Journal,magazine,transaction,proceeding
  7. 有趣的keil MDK细节
  8. unigui数据库连接池
  9. 利用rman进行异机还原(目录相同)
  10. 关于关注和取消关注的nodejs写法