一、需求

1、用户表,字段包括:用户名,用户id,昵称,年龄,性别,所在城市,邮箱,手机号。
2、方便对每一个字段进行检索,当一个用户的信息传递进入后台(信息并不完整,可能只有一个id,或者有所在城市和邮箱号),要求根据传递的信息,查询出符合条件的所有人。
3、结果输出相应的sql语句。


二、代码实现

1、用户表user类

package test.annotation;/*** @author 谢世杰*/
@Table("user")
class User {@Column("id")private int id;@Column("username")private String username;@Column("nickname")private String nickname;@Column("age")private int age;@Column("city")private String city;@Column("email")private String email;@Column("phone")private int phone;public void setId(int id) {this.id = id;}public void setUsername(String username) {this.username = username;}public void setNickname(String nickname) {this.nickname = nickname;}public void setAge(int age) {this.age = age;}public void setCity(String city) {this.city = city;}public void setEmail(String email) {this.email = email;}public void setPhone(int phone) {this.phone = phone;}public int getId() {return id;}public String getUsername() {return username;}public String getNickname() {return nickname;}public int getAge() {return age;}public String getCity() {return city;}public String getEmail() {return email;}public int getPhone() {return phone;}
}

2、注解table类

package test.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** @author 谢世杰*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {String value();
}

3、注解column类

package test.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** @author 谢世杰*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {String value();
}

4、测试环境main类

package test.annotation;import java.lang.reflect.Field;
import java.lang.reflect.Method;/*** @author 谢世杰*/
public class Main {public static void main(String[] args) throws Exception {User user1 = new User();User user2 = new User();User user3 = new User();user1.setId(1995);user1.setNickname("xsj");user3.setEmail("xsj@163.com");query(user1);query(user2);query(user3);}/*** 根据对象的数据打印查询sql语句* */private static void query(User user) throws Exception {// 用于拼装sqlStringBuilder str = new StringBuilder();// 获得用户类的类对象Class userClass = user.getClass();// 获得表名if (!userClass.isAnnotationPresent(Table.class)) {throw  new Exception("没有表名注解");}Table table = (Table)userClass.getAnnotation(Table.class);String tableName = table.value();// 开始拼装sqlstr.append("select * from ").append(tableName).append(" where 1=1");// 获得用户类中的成员变量数组Field[] fields = userClass.getDeclaredFields();// 循环得到每一个用户类成员变量和表字段名for (Field field : fields) {// 判断字段是否有注解,没有则跳过if (!field.isAnnotationPresent(Column.class)) {continue;}// 获得成员变量的注解columnColumn column = field.getAnnotation(Column.class);// 用户表的字段名String columnName = column.value();// 成员变量名String fieldName = field.getName();// 根据成员变量名获得get方法名String getMethodName = "get" + fieldName.substring(0,1).toUpperCase()+ fieldName.substring(1);// 根据方法名获得get方法Method method = userClass.getMethod(getMethodName);// 设置获得数据的变量,由于成员变量的类型不唯一,所以设置为object类型Object getValue = null;// 执行方法,获得值getValue = method.invoke(user);// 判断值是否为空,不同类型的空值不同,注意分条件判断if (getValue == null|| getValue instanceof Integer && (Integer) getValue == 0) {continue;}// 拼装where条件if (getValue instanceof Integer) {str.append(" and " + columnName + "="+getValue+"");} else {str.append(" and " + columnName + "='"+getValue+"'");}}System.out.println(str);}
}

执行结果:

select * from user where 1=1 and id=1995 and nickname='xsj'
select * from user where 1=1
select * from user where 1=1 and email='xsj@163.com'

Java面试知识点(六十五)Java注解(下)——实战篇相关推荐

  1. java面试(二十五)--(1)redis为什么读写速率快性能好(2)说说web.xml文件中可以配置哪些内容(3)和的区别(4)扑克牌顺子

    1. redis为什么读写速率快性能好? 1.Redis将数据存储在内存上,避免了频繁的IO操作 2.Redis其本身采用字典的数据结构,时间复杂度为O(1),且其采用渐进式的扩容手段 3.Redis ...

  2. 机器学习知识点(二十五)Java实现隐马尔科夫模型HMM之jahmm库

    1.隐马尔可夫模型HMM的应用场景,关乎于序列和状态变化的都可以.    发现java有可库,专为开发HMM,可惜只能在CSDN上有得下载.     2.jahmm是java开发隐马尔科夫模型的一个j ...

  3. Java学习笔记二十五:Java面向对象的三大特性之多态

    Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...

  4. python数据分析及可视化(十五)数据分析可视化实战篇(抖音用户数据分析、二手房数据分析)

    python数据分析的实战篇,围绕实例的数据展开分析,通过数据操作案例来了解数据分析中的频繁用到的知识内容. 抖音用户数据分析 1.理解数据 数据字段含义 了解数据内容,确保数据来源是正常的,安全合法 ...

  5. Java 面试知识点解析(六)——数据库篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  6. Java 面试知识点解析(五)——网络协议篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  7. Java面试知识点(全)- Java面试基础部分一

    Java面试知识点(全) :https://nanxiang.blog.csdn.net/article/details/130640392 Java基础 语法基础 面向对象 封装 利用抽象数据类型将 ...

  8. Java 面试知识点解析(七)——Web篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  9. JAVA面试常考系列五

    转载自 JAVA面试常考系列五 题目一 串行(serial)收集器和吞吐量(throughput)收集器的区别是什么? 吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序 ...

  10. 2019年秋招 Java 面试知识点梳理(高频问题)

    Java 面试知识点梳理 基础一 JVM-内存区域分配 HotSpot 对象创建 JVM-类加载机制 JVM-内存分配(堆上的内存分配) JVM-GC回收机制 JVM-垃圾收集器 JVM指令重排序 重 ...

最新文章

  1. 闲来无事 linux cp命令的三种实现方式
  2. 济南长清区谋定特色展销中心 对话中国农民丰收节交易会
  3. PAT 1016 部分A+B
  4. python环境配置opencv_Python 3.5.1和Opencv 3.1的环境配置
  5. 什么是事件冒泡?如何阻止事件冒泡?
  6. debian uefi legacy 区别_电脑硬盘格式有Legacy与UEFI,选择哪一个好?千万别选错了!...
  7. SSH框架之-hibernate 三种状态的转换
  8. ecshop mysql 标题表_ecshop商品分类列表页如何自定义title标题
  9. PSTN ,PBX ,IP PBX,VoIP
  10. 图像旋转之以原点为中心
  11. php 测试网站打开速度,JS如何测试目标网站的打开响应速度
  12. android 锁屏 浮动窗口,Android如何实现锁屏状态下弹窗
  13. Self-Attention with Relative Position Representations(2018)
  14. 简单制作一个百度注册页面
  15. php 分词搜索 splitword
  16. EPLAN界面编辑背景颜色更改
  17. 谈谈一只菜鸟转行Erlang游戏服务端的经历(希望大佬指导,也希望我的经历能给一些还未毕业的同学或者正在迷茫自己工作内容的同学一些感触)
  18. 操作系统:进程间通讯的七种方式
  19. 硅计算机的原理,量子计算机工作原理揭秘
  20. 投资初创企业股权分配方法

热门文章

  1. 亚嵌教育李明:一生的学习
  2. 【报表福利大放送】100余套报表模板免费下
  3. CAD2007学习笔记
  4. 各代iphone尺寸_历代iPhone尺寸对比,你最喜欢哪一代?
  5. 31个惊艳的数据可视化作品,让你感受“数据之美”!
  6. Redis_21_RedisCluster集群版搭建和SpringBoot的使用(实践开发类)
  7. Eslint:Parsing error: The keyword ‘interface‘ is reserved
  8. C# winform 魔兽MH全图 :WjeWar V1.5 (完全开源)
  9. 芭蕉树上第十四根芭蕉-- Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX
  10. OV426+OVM6946基于FPGA调试成像