定义描述用户表的注解:

package dao;

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 dao;

 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类User:

 package dao;

 /**
*
* 用户表,字段包括:用户ID、用户名、昵称、年龄、性别、所在城市、邮箱、手机号:
*
* @author */
@Table("user")
public class User {
@Column("id")
private int id; @Column("user_name")
private String userName; @Column("nick_name")
private String nickName; @Column("age")
private int age; @Column("city")
private String city; @Column("email")
private String email; @Column("mobile")
private String mobile; 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 String getNickName() {
return nickName;
} public void setNickName(String nickName) {
this.nickName = nickName;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getCity() {
return city;
} public void setCity(String city) {
this.city = city;
} 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;
}
}

根据参数动态返回查询语句:

 package dao;

 import java.lang.reflect.Field;
import java.lang.reflect.Method; /**
* 根据参数动态返回查询语句
*
* @author */
public class ReturnQuery { public static String query(User u1) {
StringBuilder str = new StringBuilder();
// 1.获取一个类class
Class c = u1.getClass();
// 2.获取Table的名字
boolean exists = c.isAnnotationPresent(Table.class);
if (!exists) {
return null;
}
Table t = (Table) c.getAnnotation(Table.class);
String tableName = t.value();
str.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);// 判断是否包含Column类型的注解
if (!fExists) {
continue;
}
Column column = field.getAnnotation(Column.class);
String columnName = column.value();
// 4.2取到字段的值
String fieldName = field.getName();
// 获取相应字段的getXXX()方法
String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
Object fieldValue=null;
try {
Method getMethod = c.getMethod(getMethodName);
fieldValue = getMethod.invoke(u1);
} catch (Exception e) {
e.printStackTrace();
}
//4.3拼接Sql
if (fieldValue==null||fieldValue instanceof Integer &&(Integer)fieldValue==0) {
continue;
}
str.append(" and ").append(fieldName);
if (fieldValue instanceof String) {
if (((String) fieldValue).contains(",")) {
String[] values=((String) fieldValue).split(",");
str.append(" in (");
for (String s : values) {
str.append("'").append(s).append("'").append(",");
}
str.deleteCharAt(str.length()-1);
str.append(")");
}else{
str.append("=").append("'").append(fieldValue).append("' ");
}
}else {
str.append("=").append(fieldValue);
}
}
return str.toString();
} }

测试类:

 package dao;

 public class Test {
public static void main(String[] args) {
User u1 = new User();
u1.setId(10); // 查询id User u2 = new User();
u2.setUserName("JSFei"); // 模糊查询用户名
u2.setAge(21); User u3 = new User();
u3.setEmail("123@163.com,123@qq.com"); // 查询邮箱有任意一个的用户 String sql1 = ReturnQuery.query(u1);
String sql2 = ReturnQuery.query(u2);
String sql3 = ReturnQuery.query(u3); System.out.println(sql1);
System.out.println(sql2);
System.out.println(sql3);
}
}

输出结果:

...............................................

最新文章

  1. 个人对B/S项目的一些理解(三)--Servlet与Strust
  2. poj 3253 Fence Repair
  3. 正则表达式30分钟入门:http://deerchao.net/tutorials/regex/regex.htm#mission
  4. cpp异常详解
  5. 从头构建自己的Linux系统
  6. 使用Tengine替代Nginx作为负载均衡服务器
  7. TaskTracker任务初始化及启动task源码级分析
  8. oracle数据库常用SQL语句(11.29更新)
  9. IOS基础之设置APP的名字、设置图标、添加等待加载时的图片
  10. UL LI 布局 TAB 切换条
  11. 实战ffs函数
  12. SQL SERVER与C#的数据类型对应表
  13. maven自定义jar到本地仓库
  14. visio移动形状 上下左右键 移动滚动条
  15. 【Android Studio安装部署系列】七、真机运行项目
  16. 配置nginx + keepalived 双主模式(双机互为主备)
  17. Swoft 图片上传与处理
  18. 嘿!我用python帮我干这些事
  19. 使用Topshelf开发Windows服务、log4net记录日志
  20. BZOJ.5093.[Lydsy1711月赛]图的价值(NTT 斯特林数)

热门文章

  1. [Design Pattern] Command Pattern 命令模式
  2. 基于deb包快速搭建内外apt源
  3. java排序算法-选择排序
  4. linux —— 问题解决(锦集)
  5. 从无到有开发连麦直播技术<转>
  6. PHP学习之[第01讲]开启PHP学习之路,融入新互联网时代
  7. [转] linux下的僵尸进程处理SIGCHLD信号
  8. yii cgridview 默认的筛选如何做成选择框
  9. C#中的序列化与反序列化
  10. EF 已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭