zoukankan      html  css  js  c++  java
  • 做一个简单下载功能的记录

    给同事做一个下载的功能,将数据库关联查询后生产csv文件供下载,期间遇到的小问题,记录下。

    1,数据库的关联查询

      查询出来的数据结构是:一个表TABLE_A的部分数据,和TABLE_A的每条数据在TABLE_B表中的个数

      mapper.xml文件 sql语句(下面的方式可能会引发一些问题,下面讲)

      <resultMap id="aAndCount" type="com.model.AandCount">

        <result column="follow_count" property="followCount" jdbcType="INTEGER">

        <association column="a.id" property="dxzf" javaType="com.model.Dxzf">

          <id column="id" jdbcType="INTEGER" property="id"/>

          <result column="name" jdbcType="VARCHAR" property="name"/>

        </association>

      </resultMap>

      <select id="queryAandCount" resultMap="aAndCount">

        select count(a.id) follow_count , a.id id , a.name name

        from TABLE_A a

        inner join TABLE_B b on TABLE_A.id = TBALE_B.aId and TABLE_A.status = 1

        group by aId 

        order by follow_count desc

        limit 100

      </select>

      然后在aMapper.java中

      List<AandCount> queryAandCount();

      当用service调用这个mapper.queryAandCount()的时候,返回的数据与预想的不一样.

      具体是:follow_count 字段没有重复的数据,即 只有唯一性的数据 14,13,12,11,... 而把sql放到客户端执行,真实数据是 14,13,13,12,12,11...  

      怀疑是把 follow_count 做了唯一性处理。

      所以修改了 mapper.xml文件 sql语句 如下(因为 a表的id是返回的数据中唯一性的,将其添加到第一个返回值中)

         <resultMap id="aAndCount" type="com.model.AandCount">

        <result column="a_id" property="aId" jdbcType="INTEGER">

        <result column="follow_count" property="followCount" jdbcType="INTEGER">

        <association column="a.id" property="dxzf" javaType="com.model.Dxzf">

          <id column="id" jdbcType="INTEGER" property="id"/>

          <result column="name" jdbcType="VARCHAR" property="name"/>

        </association>

      </resultMap>

      <select id="queryAandCount" resultMap="aAndCount">

        select a.id a_id , count(a.id) follow_count , a.id id , a.name name

        from TABLE_A a

        inner join TABLE_B b on TABLE_A.id = TBALE_B.aId and TABLE_A.status = 1

        group by aId 

        order by follow_count desc

        limit 100

      </select>

      暂时这么解决了问题。  

    2,文件下载的实现

      在nginx配置文件中添加了下载路径

      server{

        listen 80;

        server_name test.abcd.com;

        location ~ ^/csv # 下载csv文件的路径

        {

          root  /opt/tomcat-abcd ; # 当访问到 test.abcd.com/csv 的时候将会查找服务器中的 /opt/tomcat-abcd/csv 里面的文件.

        }

      }

      Controller.java 文件

      @RequestMapping(value="/downloadCSV")

      public String downloadCSV(Model model){

        List<AandCount>  list = service.queryAandCount();

        String fileName = "./csv/date.csv";

        createCSV(list,fileName);

        // 跳转到下载链接

        model.addAttribute("redirectUrl",fileName.replaceFirst(".",""));

        return "forward:/home/operationRedirect";

      }

    3,csv的生成 createCSV(list,fileName);

      public void createCSV(List<AandCount> list,String fileName){

        XSSFWorkbook workbook = new XSSFWordbook();

        XSSFWordbook sheet = workbook.createSheet("sheetName");

        if(CollectionUtils.isNotEmpay(list)){

          int index = 0;

          foreach(AandCount a : list){

            XSSFRow row = sheet.createRow(i);

            XSSFCell cell = row.createCell(0,Cell.CELL_TYPE_STRING);

            cell.setCellValue(a.getaId());

            ...

          }

        }

        // 将csv写入服务器指定路径

        FileOutputStream fos = null;

        try{

          fos = new FileOutputStream(fileName);

          workbook.write(fos);

        }catch(IOExecption e){  

          ...

        }finally{

          if(fos != null){

            try{

              fos.close();

            }catch(IOExecption e){

              ...

            }

          }

        }

      }

  • 相关阅读:
    榫卯游戏介绍
    如果你有一个域名,你也可以免费有一个diy@yourdomain.com的企业邮局
    封装一个axios请求后台的通用方法
    javascript判断两个对象属性以及值是否相等
    遍历出文档内所有元素的tagName
    windows下nginx的安装及使用方法入门
    css样式重置样式
    canvas绘图
    表单脚本
    javascript事件
  • 原文地址:https://www.cnblogs.com/wangziqiang/p/5839752.html
Copyright © 2011-2022 走看看