闲来没事,想了一个应用的例子:用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)用法:利用注解和反射机制指定列名导出数据库数据的更多相关文章

  1. Java注解Annotation与自定义注解详解

    Java注解简介 开发中经常使用到注解,在项目中也偶尔会见到过自定义注解,今天就来探讨一下这个注解是什么鬼,以及注解的应用场景和如何自定义注解. 下面列举开发中常见的注解 @Override:用于标识 ...

  2. java 注解annotation的使用,以及反射如何获取注解

     一.注解基本知识 1.元注解 元注解是指注解的注解.包括  @Retention @Target @Document @Inherited四种. 1. Annotation型定义为@interfac ...

  3. java 编程基础:注解(Annotation Processing Tool)注解处理器 利用注解解读类属性生成XML文件

    APT的介绍: APT(Annotation Processing Tool)是一种注解处理工具,它对源代码文件进行检测,并找出源文件所包含的注解信息,然后针对注解信息进行额外的处理. 使用APT工具 ...

  4. 深入JAVA注解(Annotation):自定义注解 (转)

    原文出自:http://blog.csdn.net/yjclsx/article/details/52101922 一.基础知识:元注解 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义 ...

  5. Java中Annotation用法

    其他还可以参考的地址 https://www.cnblogs.com/skywang12345/p/3344137.html Annotation Annotation其实是代码里的特殊标记,这些标记 ...

  6. JAVA学习第六十四课 — 反射机制

       Java反射机制是在执行状态中,对于随意一个类,都可以知道这个类的全部属性和方法,对于随意一个对象,都可以调用它的随意一个方法和属性,这样的动态获取的信息以及动态调用对象的方法的功能称为java ...

  7. Java开发培训基础知识解析之反射机制

    Java是老牌编程语言,是当前应用最广泛的编程语言之一.想要学习Java你就一定要掌握Java基础知识,而反射对于初学Java的人来说绝对是非常重要的知识点.什么是反射?如何理解反射机制?如何使用反射 ...

  8. java导出数据到excel里:直接导出和导出数据库数据

    一.直接导出 package com.ij34.util; import java.io.FileNotFoundException; import java.io.FileOutputStream; ...

  9. C语言函数sscanf()的用法-从字符串中读取与指定格式相符的数据(转)

    C语言函数sscanf()的用法 sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int sscanf( string str, string fmt, mixed var ...

随机推荐

  1. 特征选择:方差选择法、卡方检验、互信息法、递归特征消除、L1范数、树模型

    转载:https://www.cnblogs.com/jasonfreak/p/5448385.html 特征选择主要从两个方面入手: 特征是否发散:特征发散说明特征的方差大,能够根据取值的差异化度量 ...

  2. 在控制终端输入AT命令

    控制台终端输入AT命令到smd8,步骤如下: 1. 先执行命令 cat /dev/smd8 & 2. 再执行  echo  -e  "ati\r\n"  > /dev ...

  3. python学习菜单

    一.python简介 二.python字符串 三.列表 四.集合.元组.字典 五.函数 六.python 模块 七.python 高阶函数 八.python 装饰器 九.python 迭代器与生成器  ...

  4. php printf() 输出格式化的字符串

    php printf() 函数用于输出格式化的字符串,本文章向码农介绍php printf()函数的使用方法和基本使用实例,感兴趣的码农可以参考一下. 定义和用法 printf()函数输出格式化的字符 ...

  5. hive的安装,一般不容易察觉的hdfs的配置问题导致hive安装的失败

    在安装hive的过程中,一般需要的准备环境就是hadoop集群的正常启动,要装有mysql,zookeeper. 具体怎么安装配置我在这里不多说,安装教程网上有挺多的. 我这里说下我遇到的问题,首先从 ...

  6. NLP-Progress记录NLP最新数据集、论文和代码: 助你紧跟NLP前沿

    Github https://github.com/sebastianruder/NLP-progress 官方网址 https://nlpprogress.com/ NLP-Progress 同时涵 ...

  7. solr 通过【配置、多值字段、动态字段】来解决文本表达式查询精确到句子的问题

    一.Solr Multivalue field属性positionIncrementGap理解 分类:Lucene 2014-01-22 10:39阅读(3596)评论(0) 参考:http://ro ...

  8. JavaScript中‘==’和'==='的区别

    javascript中,两个等号‘==’和三个等号‘===’的区别: 简单说,‘===’比‘==’对相等的概念更为严格,使用‘==’时,数字 1 和 字符串 “1” 是相等的: 而使用‘===’时,数 ...

  9. Web 跨域请求(OCRS) 前端解决方案

    1.同源策略如下: URL 说明 是否允许通信 http://www.a.com/a.jshttp://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.j ...

  10. CentOS 6.6下Cacti安装部署

    Cacti简介 本章结构 常见平台 常见的服务器监控软件 cacti,流量与性能监测为主----http://www.cacti.net/ nagios,服务与性能监测为主---http://www. ...