闲来没事,想了一个应用的例子:用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的方式跟传进去的参数一一匹配,然后每次写数据的时候执行那个方法来获取当前要导出的列的数据。

如下:

  1. public static Object getStudentInfo(Student student, int index) {
  2. switch(index) {
  3. case 1 :
  4. return student.getName();
  5. case 2 :
  6. return student.getSex();
  7. ...
  8. }
  9. }

可是这样看起来太傻逼了,于是接着想有没有比较合理的方式实现呢?

后来想到了用注解和java的反射机制来实现。

现在java注解用途越来越广泛了,如Google的Guice,一轻量级的IOC框架,大有跟Spring抗衡的趋势。

我就用注解来标注get方法获取的数据在数据库中对应列的索引,然后,根据传进去的列数组匹配get方法,再利用java的反射,执行方法体获取列的数据。具体代码如下。

MapValue是一个Annotation,里面只有一个index()方法,用来标注方法的索引。

  1. package com.cnblogs.rolf.dao;
  2.  
  3. import java.lang.annotation.ElementType;
  4. import java.lang.annotation.Retention;
  5. import java.lang.annotation.RetentionPolicy;
  6. import java.lang.annotation.Target;
  7. /**
  8. * 放在方法上的注解,这个注解可以映射方法的索引
  9. * @author 草原战狼
  10. *
  11. */
  12. @Target(value = {ElementType.METHOD})
  13. @Retention(RetentionPolicy.RUNTIME)
  14. public @interface MapValue {
  15. /**
  16. * 标注方法的索引
  17. * @return 方法索引值
  18. */
  19. int index() default 0;
  20. }

View MapValue Code

Student类是用来map到数据库的实体类,上面的get方法用MapValue标注了它在数据库中表列的顺序。

  1. package com.cnblogs.rolf.entity;
  2.  
  3. import com.cnblogs.rolf.dao.MapValue;
  4.  
  5. /**
  6. * Student 相当于一个表的实体类,我们可以假想它是从数据库读出来映射出来的一张表信息
  7. * STUDENT_COLUMN_NAMES: 这张表的类名
  8. * @author 草原战狼
  9. *
  10. */
  11. public class Student {
  12. public static String[] STUDENT_COLUMN_NAMES = {"Name", "Sex", "Age", "Height", "Weight", "Grade"};
  13. private String name;
  14. private String sex;
  15. private int age;
  16. private int height;
  17. private int weigth;
  18. private int grade;
  19.  
  20. public Student(String name, String sex, int age, int height, int weight, int grade) {
  21. this.name = name;
  22. this.sex = sex;
  23. this.height = height;
  24. this.weigth = weight;
  25. this.age = age;
  26. this.grade = grade;
  27. }
  28. public Student() {
  29.  
  30. }
  31.  
  32. @MapValue(index = 1)
  33. public String getName() {
  34. return name;
  35. }
  36. public void setName(String name) {
  37. this.name = name;
  38. }
  39. @MapValue(index = 2)
  40. public String getSex() {
  41. return sex;
  42. }
  43. public void setSex(String sex) {
  44. this.sex = sex;
  45. }
  46. @MapValue(index = 3)
  47. public int getAge() {
  48. return age;
  49. }
  50. public void setAge(int age) {
  51. this.age = age;
  52. }
  53. @MapValue(index = 4)
  54. public int getHeight() {
  55. return height;
  56. }
  57. public void setHeight(int height) {
  58. this.height = height;
  59. }
  60. @MapValue(index = 5)
  61. public int getWeigth() {
  62. return weigth;
  63. }
  64. public void setWeigth(int weigth) {
  65. this.weigth = weigth;
  66. }
  67. @MapValue(index = 6)
  68. public int getGrade() {
  69. return grade;
  70. }
  71. public void setGrade(int grade) {
  72. this.grade = grade;
  73. }
  74. }

View Student Code

TestMain是测试的类,里面还有两个方法,这两个方法是用来处理实体类和要导出列数组的匹配。

  1. package com.cnblogs.rolf;
  2.  
  3. import java.lang.reflect.InvocationTargetException;
  4. import java.lang.reflect.Method;
  5.  
  6. import com.cnblogs.rolf.dao.MapValue;
  7. import com.cnblogs.rolf.entity.Student;
  8. /**
  9. * 可以应用在从数据库导出数据,根据指定要导出的列,导出到Excel, Word等。这个只是中间的环节
  10. * @author 草原战狼
  11. *
  12. */
  13. public class TestMain {
  14. public static void main(String[] args) {
  15. Student student = new Student("XiaoMing", "Male", 20, 175, 135, 2);
  16. int[] indexs = {34,2,5,3,0,1,2,4,6};
  17. System.out.println(student.getAge());
  18. String[] names = Student.STUDENT_COLUMN_NAMES;
  19. String printColumns = getColumnName(names, indexs);
  20. String pringStudentInfo = getStudentInfo(student, indexs);
  21. System.out.println(printColumns);
  22. System.out.println(pringStudentInfo);
  23. }
  24. /**
  25. * 接收一张表的实体类和外面传进来的要导出的列的索引顺序,比如要导出第2列,第4列,那么可以传入{2,4}
  26. * 返回获取到的指定列的值
  27. * @param student 表的实体类
  28. * @param indexs 要导出的列的索引
  29. * @return 指定列的值
  30. */
  31. public static String getStudentInfo(Student student, int[] indexs) {
  32. String studentInfo = "";
  33. Method[] methods = Student.class.getMethods();
  34. for(int index : indexs) {
  35. for(Method method : methods) {
  36. MapValue mapValue = method.getAnnotation(MapValue.class);
  37. if(mapValue == null){
  38. continue;
  39. }else {
  40. if(index == mapValue.index()) {
  41. Object value = null;
  42. try {
  43. value = method.invoke(student);
  44. } catch (IllegalAccessException
  45. | IllegalArgumentException
  46. | InvocationTargetException e) {
  47. System.out.println("parameters number is wrong.");
  48. e.printStackTrace();
  49. }
  50. studentInfo += value.toString() + ", ";
  51. break;
  52. }
  53. }
  54. }
  55. }
  56. return studentInfo;
  57. }
  58. /**
  59. * 根据指定的索引导出列的名称
  60. * @param names 整张表所有列的名称
  61. * @param indexs 要导出的列的索引
  62. * @return 导出的列的名称
  63. */
  64. public static String getColumnName(String[] names, int[] indexs) {
  65. String result = "";
  66. for(int index : indexs) {
  67. if(index > names.length || index < 1) {
  68. continue;
  69. }
  70. result += names[index - 1] + ", ";
  71. }
  72. return result;
  73. }
  74. }

View TestMain Code

测试的结果:

  1. Sex, Weight, Age, Name, Sex, Height, Grade,
  2. 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. RedisCluster读写分离改造

      RedisCluster模式启动的环境中,通过Redis中的每个连接,都可以访问 cluster nodes 访问到所有的服务器列表以及其所处于的角色(master/slave).对于RedisC ...

  2. [ffmpeg_3.3.2]demuxing_decoding.c

    分析ffmpeg3.3.2的example: 由于ffmpeg文档比较少,而且API变化表较大,所以个人首先从ffmpeg自带的demo开始分析,分析(demuxing_decoding.c) 1:首 ...

  3. extract 用法说明

    PHP extract() 函数从数组中把变量导入到当前的符号表中 定义和用法 PHP extract() 函数从数组中把变量导入到当前的符号表中. 对于数组中的每个元素,键名用于变量名,键值用于变量 ...

  4. 哈希与位图(Hash and BitMap)

    Hash:哈希机制 BitMap:位图机制 目的:都是为了保证检索方便而设置的数据结构 对于大数据进行排序,由于内存限制,不可能在内存中进行,所以采取BitMap机制 为了在大数据中快速检索以及操作数 ...

  5. JQ树插件 — zTree笔记

    1.zTree作者很贴心的为使用者将不同功能的代码封装成不同的文件,方便大家尽量减少加载的代码量,如果基本全用到,则不必一个个引用,有一个文件“jquery.ztree.all.js”,包含了所有.如 ...

  6. Kubernetes 无法删除pod实例的排查过程

    今天在k8s集群创建pod时,执行了如下命令: #kubectl run busybox-service --image=busybox --replicas=3 但是在创建过程中pod既然失败了, ...

  7. 常用数据库1 sqlserver

    知识内容: 1.SqlServer数据库概述 2.SqlServer数据库基本操作 3.Transact-SQL程序设计 一.SqlServer数据库概述 1.SqlServer系统概述 SQLSer ...

  8. tornado-请求与响应

    import tornado.ioloop import tornado.web import tornado.httpserver # 非阻塞 import tornado.options # 提供 ...

  9. Spring MVC 学习笔记2 - 利用Spring Tool Suite创建一个web 项目

    Spring MVC 学习笔记2 - 利用Spring Tool Suite创建一个web 项目 Spring Tool Suite 是一个带有全套的Spring相关支持功能的Eclipse插件包. ...

  10. 浅谈RMI的特点及作用

    RMI:远程方法调用(Remote Method Invocation) 扩展:RPC与RMI的区别 1:方法调用方式不同: RMI中是通过在客户端的Stub对象作为远程接口进行远程方法的调用.每个远 ...