闲来没事,想了一个应用的例子:用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 4 import java.lang.annotation.ElementType; 5 import java.lang.annotation.Retention; 6 import java.lang.annotation.RetentionPolicy; 7 import java.lang.annotation.Target; 8 /** 9 * 放在方法上的注解,这个注解可以映射方法的索引 10 * @author 草原战狼 11 * 12 */ 13 @Target(value = {ElementType.METHOD}) 14 @Retention(RetentionPolicy.RUNTIME) 15 public @interface MapValue { 16 /** 17 * 标注方法的索引 18 * @return 方法索引值 19 */ 20 int index() default 0; 21 }