JAVA 基于注解的报表映射
发布日期:2021-04-30 21:03:51 浏览次数:88 分类:精选文章

本文共 4509 字,大约阅读时间需要 15 分钟。

随着Spring生态系统的快速发展,注解(Annotation)在开发中的应用越来越广泛。尤其是在RESTful架构盛行的今天,注解式开发已然成为现代Java开发的标配。各大框架纷纷推出支持Restful注解(如@POST、@GET等)的解决方案。本文将深入探讨Java注解的机制,并通过实际案例演示如何利用注解实现数据库查询及报表生成。

一、元注解:注解的基础

注解的开发始于JDK 1.5,通过@Target、@Retention等元注解,定义了注解的目标位置、保留周期及其他附加信息。

  • @Target:指定注解所作用的元素类型。

    • ElementType.TYPE:修饰类、接口或枚举。
    • ElementType.FIELD:修饰成员变量。
    • ElementType.CONSTRUCTOR:修饰构造器。
    • ElementType.METHOD:修饰方法。
    • ElementType.PARAMETER:修饰方法参数。
    • ElementType.LOCAL_VARIABLE:修饰局部变量。
  • @Retention:定义注解的保留周期。

    • RetentionPolicy.SOURCE:注解仅存在于源码中。
    • RetentionPolicy.CLASS:注解编译入.class文件。
    • RetentionPolicy.RUNTIME:注解在运行时有效。
  • @Document与@Inherited

    • @Document:将注解包含在Javadoc中。
    • @Inherited:允许子类继承注解属性。
  • 二、类型注解:@Target(ElementType.TYPE)

  • 创建注解

    • 使用Annotation接口定义注解,例如:
      @Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface TypeAnnotation {    public String name() default "默认名称";}
  • 使用注解

    • 在类上应用TypeAnnotation注解,获取注解信息时,可通过反射机制获取。
  • 三、其他类型注解

    除了类型注解,其他注解如@Constructor@Field@Method等同样遵循上述元注解规则,具体用于不同的元素修饰。

    四、注解的实际应用

    在实际开发中,注解的应用主要体现在数据处理和报表生成。以下是一个典型案例:

    数据库查询与报表生成

  • JavaBean定义

    • 定义一个JavaBean类,带有注解:
      public class DW_IDCODE_INVEST {    @Column(PhoenixColumn = "ROWKEY")    private String rowkey;    @Column(PhoenixColumn = "YM", ExcelHeader = "日期")    private String ym;    // 其他字段...}
    • 通过@PhoenixColumn和@ExcelHeader注解,定义数据库字段和报表显示列。
  • DAO层实现

    • 使用PhoenixTemplate等工具,通过反射机制读取注解信息,完成数据映射:
      public class PhoenixTemplate {    private Class
      entityClass; private Field[] fields; public PhoenixTemplate() { ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass(); entityClass = (Class
      ) type.getActualTypeArguments()[0]; fields = entityClass.getDeclaredFields(); } public List
      find(String sql, Object[] args) throws Exception { List
      res = new ArrayList<>(); List
      > queryRes = pCommonDao.query(sql, args); for (Map
      queryData : queryRes) { T t = (T) entityClass.newInstance(); for (Field field : fields) { String fieldName = field.getName(); Column columnAnnotation = field.getAnnotation(Column.class); if (columnAnnotation != null) { String phoenixColumn = columnAnnotation.PhoenixColumn(); Object value = queryData.containsKey(phoenixColumn) ? FilterUtil.nullFilter((String) queryData.get(phoenixColumn)) : ""; field.setAccessible(true); field.set(t, value); } } res.add(t); } return res; }}
  • Controller层处理

    • 在Controller中调用DAO,获取数据并返回报表:
      @Controller@RequestMapping("PlatProDataAction")public class PlatProDataAction {    @Autowired    private PlatProDataDao dao;    @ResponseBody    @RequestMapping(value = "/getData.do", method = RequestMethod.POST)    public void getData(HttpServletRequest request, HttpServletResponse response, PageBean pageBean) throws Exception {        String sql = "select * from DW_IDCODE_INVEST where YM = ?";        List
      res4Report = dao.find(sql, new Object[]{pageBean.starttime}); String[] columnNames = new String[fields.length]; List
      infoList = new ArrayList<>(); for (DW_IDCODE_INVEST dw : res4Report) { String[] info = new String[fields.length]; for (int i = 0; i < fields.length; i++) { Field field = fields[i]; Column columnAnnotation = field.getAnnotation(Column.class); if (columnAnnotation != null) { columnNames[i] = columnAnnotation.ExcelHeader(); } String getterName = "get" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1); info[i] = (String) field.get(dw); } infoList.add(info); } Map
      res = new HashMap<>(); res.put("tableHeader", columnNames); res.put("tableData", infoList); response.getWriter().write(JSON.toJSONString(res)); }}
  • 页面处理

    • 使用AJAX或直接在页面中渲染表格:
      # 头部
      {{ $index + 1 }} {{ rowdata.ym }}
  • 五、扩展与总结

  • 扩展数据库查询

    • 通过@RenderSQL注解,将SQL语句和参数注入JavaBean中:
      @RenderSQL(sql = "select * from DW_IDCODE_INVEST where YM = ?", paras = "{YM}")public class DW_IDCODE_INVEST {    // ...}
  • 统一报表生成

    • 在页面和Controller中统一处理,通过注解配置,减少重复代码。
  • 框架化开发

    • 将上述逻辑封装到一个可扩展的框架中,如GenUI,实现自动代码生成和报表展示。
  • 通过以上方法,开发者可以显著提升开发效率,减少重复性代码,实现快速报表生成和数据处理。

    上一篇:【Notes6】iNode,文件查找与读取,iptables,hash
    下一篇:MyBatisPlus学习笔记__01:简介+入门+CRUD扩展

    发表评论

    最新留言

    路过,博主的博客真漂亮。。
    [***.116.15.85]2026年06月01日 08时02分47秒