Java注解(Annotation)用法:利用注解和反射机制指定列名导出数据库数据
闲来没事,想了一个应用的例子:用java如何把数据库的数据根据我们指定的某几列,如第2列,第4列,第6列导出来到Excel里?
写代码也是为了应用的,写好的代码更重要的是在于思考。我自己思考了这个示例。
问题:指定列把数据库数据根据列导出到Excel里。
那么要处理这个问题,它其实是很简单的,但是再简单的问题,也需要去拆分,思考,所谓,麻雀虽小,五脏俱全嘛。
拆分:1. Load DB data; 2. 把数据和指定列映射起来;3. 导出数据到Excel。
本文把第一步操作省略了,第一步操作就是读取数据库的数据,然后把它映射到Entity上去,也就是下面代买的Student.java,我们假设这一步已经成功。
以下三个类重点实现第二步,第三步,只要把已经map好的数据,导出到Excel,可以利用apache poi,详见前一篇文章:java POI创建Excel示例(xslx和xsl区别 )
第二步的实现我之前想着是直接把类的get方法用case的方式跟传进去的参数一一匹配,然后每次写数据的时候执行那个方法来获取当前要导出的列的数据。
如下:
public static Object getStudentInfo(Student student, int index) {
switch(index) {
case 1 :
return student.getName();
case 2 :
return student.getSex();
...
}
}
可是这样看起来太傻逼了,于是接着想有没有比较合理的方式实现呢?
后来想到了用注解和java的反射机制来实现。
现在java注解用途越来越广泛了,如Google的Guice,一轻量级的IOC框架,大有跟Spring抗衡的趋势。
我就用注解来标注get方法获取的数据在数据库中对应列的索引,然后,根据传进去的列数组匹配get方法,再利用java的反射,执行方法体获取列的数据。具体代码如下。
MapValue是一个Annotation,里面只有一个index()方法,用来标注方法的索引。
package com.cnblogs.rolf.dao; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 放在方法上的注解,这个注解可以映射方法的索引
* @author 草原战狼
*
*/
@Target(value = {ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MapValue {
/**
* 标注方法的索引
* @return 方法索引值
*/
int index() default 0;
}
View MapValue Code
Student类是用来map到数据库的实体类,上面的get方法用MapValue标注了它在数据库中表列的顺序。
package com.cnblogs.rolf.entity; import com.cnblogs.rolf.dao.MapValue; /**
* Student 相当于一个表的实体类,我们可以假想它是从数据库读出来映射出来的一张表信息
* STUDENT_COLUMN_NAMES: 这张表的类名
* @author 草原战狼
*
*/
public class Student {
public static String[] STUDENT_COLUMN_NAMES = {"Name", "Sex", "Age", "Height", "Weight", "Grade"};
private String name;
private String sex;
private int age;
private int height;
private int weigth;
private int grade; public Student(String name, String sex, int age, int height, int weight, int grade) {
this.name = name;
this.sex = sex;
this.height = height;
this.weigth = weight;
this.age = age;
this.grade = grade;
}
public Student() { } @MapValue(index = 1)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@MapValue(index = 2)
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@MapValue(index = 3)
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@MapValue(index = 4)
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
@MapValue(index = 5)
public int getWeigth() {
return weigth;
}
public void setWeigth(int weigth) {
this.weigth = weigth;
}
@MapValue(index = 6)
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
}
View Student Code
TestMain是测试的类,里面还有两个方法,这两个方法是用来处理实体类和要导出列数组的匹配。
package com.cnblogs.rolf; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import com.cnblogs.rolf.dao.MapValue;
import com.cnblogs.rolf.entity.Student;
/**
* 可以应用在从数据库导出数据,根据指定要导出的列,导出到Excel, Word等。这个只是中间的环节
* @author 草原战狼
*
*/
public class TestMain {
public static void main(String[] args) {
Student student = new Student("XiaoMing", "Male", 20, 175, 135, 2);
int[] indexs = {34,2,5,3,0,1,2,4,6};
System.out.println(student.getAge());
String[] names = Student.STUDENT_COLUMN_NAMES;
String printColumns = getColumnName(names, indexs);
String pringStudentInfo = getStudentInfo(student, indexs);
System.out.println(printColumns);
System.out.println(pringStudentInfo);
}
/**
* 接收一张表的实体类和外面传进来的要导出的列的索引顺序,比如要导出第2列,第4列,那么可以传入{2,4}
* 返回获取到的指定列的值
* @param student 表的实体类
* @param indexs 要导出的列的索引
* @return 指定列的值
*/
public static String getStudentInfo(Student student, int[] indexs) {
String studentInfo = "";
Method[] methods = Student.class.getMethods();
for(int index : indexs) {
for(Method method : methods) {
MapValue mapValue = method.getAnnotation(MapValue.class);
if(mapValue == null){
continue;
}else {
if(index == mapValue.index()) {
Object value = null;
try {
value = method.invoke(student);
} catch (IllegalAccessException
| IllegalArgumentException
| InvocationTargetException e) {
System.out.println("parameters number is wrong.");
e.printStackTrace();
}
studentInfo += value.toString() + ", ";
break;
}
}
}
}
return studentInfo;
}
/**
* 根据指定的索引导出列的名称
* @param names 整张表所有列的名称
* @param indexs 要导出的列的索引
* @return 导出的列的名称
*/
public static String getColumnName(String[] names, int[] indexs) {
String result = "";
for(int index : indexs) {
if(index > names.length || index < 1) {
continue;
}
result += names[index - 1] + ", ";
}
return result;
}
}
View TestMain Code
测试的结果:
Sex, Weight, Age, Name, Sex, Height, Grade,
Male, 135, 20, XiaoMing, Male, 175, 2,
草原战狼淘宝小店:http://xarxf.taobao.com/ 淘宝搜小矮人鞋坊,主营精致美丽时尚女鞋,为您的白雪公主挑一双哦。谢谢各位博友的支持。
====================================================================================
====================== 以上分析仅代表个人观点,欢迎指正与交流 =========================
====================== 草原战狼博客,转载请注明出处,万分感谢 =========================
====================================================================================
Java注解(Annotation)用法:利用注解和反射机制指定列名导出数据库数据的更多相关文章
- Java注解Annotation与自定义注解详解
Java注解简介 开发中经常使用到注解,在项目中也偶尔会见到过自定义注解,今天就来探讨一下这个注解是什么鬼,以及注解的应用场景和如何自定义注解. 下面列举开发中常见的注解 @Override:用于标识 ...
- java 注解annotation的使用,以及反射如何获取注解
一.注解基本知识 1.元注解 元注解是指注解的注解.包括 @Retention @Target @Document @Inherited四种. 1. Annotation型定义为@interfac ...
- java 编程基础:注解(Annotation Processing Tool)注解处理器 利用注解解读类属性生成XML文件
APT的介绍: APT(Annotation Processing Tool)是一种注解处理工具,它对源代码文件进行检测,并找出源文件所包含的注解信息,然后针对注解信息进行额外的处理. 使用APT工具 ...
- 深入JAVA注解(Annotation):自定义注解 (转)
原文出自:http://blog.csdn.net/yjclsx/article/details/52101922 一.基础知识:元注解 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义 ...
- Java中Annotation用法
其他还可以参考的地址 https://www.cnblogs.com/skywang12345/p/3344137.html Annotation Annotation其实是代码里的特殊标记,这些标记 ...
- JAVA学习第六十四课 — 反射机制
Java反射机制是在执行状态中,对于随意一个类,都可以知道这个类的全部属性和方法,对于随意一个对象,都可以调用它的随意一个方法和属性,这样的动态获取的信息以及动态调用对象的方法的功能称为java ...
- Java开发培训基础知识解析之反射机制
Java是老牌编程语言,是当前应用最广泛的编程语言之一.想要学习Java你就一定要掌握Java基础知识,而反射对于初学Java的人来说绝对是非常重要的知识点.什么是反射?如何理解反射机制?如何使用反射 ...
- java导出数据到excel里:直接导出和导出数据库数据
一.直接导出 package com.ij34.util; import java.io.FileNotFoundException; import java.io.FileOutputStream; ...
- C语言函数sscanf()的用法-从字符串中读取与指定格式相符的数据(转)
C语言函数sscanf()的用法 sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int sscanf( string str, string fmt, mixed var ...
随机推荐
- 特征选择:方差选择法、卡方检验、互信息法、递归特征消除、L1范数、树模型
转载:https://www.cnblogs.com/jasonfreak/p/5448385.html 特征选择主要从两个方面入手: 特征是否发散:特征发散说明特征的方差大,能够根据取值的差异化度量 ...
- 在控制终端输入AT命令
控制台终端输入AT命令到smd8,步骤如下: 1. 先执行命令 cat /dev/smd8 & 2. 再执行 echo -e "ati\r\n" > /dev ...
- python学习菜单
一.python简介 二.python字符串 三.列表 四.集合.元组.字典 五.函数 六.python 模块 七.python 高阶函数 八.python 装饰器 九.python 迭代器与生成器 ...
- php printf() 输出格式化的字符串
php printf() 函数用于输出格式化的字符串,本文章向码农介绍php printf()函数的使用方法和基本使用实例,感兴趣的码农可以参考一下. 定义和用法 printf()函数输出格式化的字符 ...
- hive的安装,一般不容易察觉的hdfs的配置问题导致hive安装的失败
在安装hive的过程中,一般需要的准备环境就是hadoop集群的正常启动,要装有mysql,zookeeper. 具体怎么安装配置我在这里不多说,安装教程网上有挺多的. 我这里说下我遇到的问题,首先从 ...
- NLP-Progress记录NLP最新数据集、论文和代码: 助你紧跟NLP前沿
Github https://github.com/sebastianruder/NLP-progress 官方网址 https://nlpprogress.com/ NLP-Progress 同时涵 ...
- solr 通过【配置、多值字段、动态字段】来解决文本表达式查询精确到句子的问题
一.Solr Multivalue field属性positionIncrementGap理解 分类:Lucene 2014-01-22 10:39阅读(3596)评论(0) 参考:http://ro ...
- JavaScript中‘==’和'==='的区别
javascript中,两个等号‘==’和三个等号‘===’的区别: 简单说,‘===’比‘==’对相等的概念更为严格,使用‘==’时,数字 1 和 字符串 “1” 是相等的: 而使用‘===’时,数 ...
- Web 跨域请求(OCRS) 前端解决方案
1.同源策略如下: URL 说明 是否允许通信 http://www.a.com/a.jshttp://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.j ...
- CentOS 6.6下Cacti安装部署
Cacti简介 本章结构 常见平台 常见的服务器监控软件 cacti,流量与性能监测为主----http://www.cacti.net/ nagios,服务与性能监测为主---http://www. ...