Java web 程序优化例子

本文介绍使用Java实现Excel批量导入导出的方法,并通过优化分页查询提高效率。主要内容包括:利用双重循环读取Excel数据并批量插入数据库,实现会员资质审核数据的导出,以及采用简洁的JQuery思想优化分页查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标题:Java POI 批量导入功能 双重循环读取数据:
文章地址:http://blog.youkuaiyun.com/u014266877/article/details/54378381
示例代码:

Controller:
//循环读取每行所有列数据
for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
    XSSFRow hssfRow = hssfSheet.getRow(rowNum);
    if(hssfRow != null){
        List<String> list = new ArrayList<String>();
        //将表格自每行数据添加到 list中 (list 集合的数据是有序号的 方便数据对应)
        for (int i = 0; i < 28; i++) {// 28 代表导入 excel 模板中的列数
            XSSFCell xssfCell = hssfRow.getCell(i);
            //初始化列值(不建议导入数据库对应表添加过多非空校验, 导入数据可能为空)
            String date = null;
            //预防空指针
            if(xssfCell != null){
                //17 列 18 列(下标从0开始 16就是17列)是时间类型, 默认用 String 类型接收
                if(i == 16 || i == 17){
                    date = Common.fromDateY(xssfCell.getDateCellValue());
                }else{
                    date = String.valueOf(xssfCell);
                }
            }
            list.add(date);
        }
        //这些数据不是表格中的 保存 登陆用户, 添加时间, 状态, 显示
        list.add(1 + "");
        list.add(loginAccount);
        list.add(Common.fromDateH());
        list.add(1 + "");
        dataMap.put(numSheet, list);
    }
}

service:
Map<String, Map<Integer, List<String>>> leadingInData = new HashMap<String, Map<Integer, List<String>>>();
@Override
public int circleInsertInterface(Map<String, Map<Integer, List<String>>> data) {
    return interfaceConcludeSignMapper.circleInsertInterface(data);
}

dao mapper:
<!-- 批量添加已签接口 -->
<insert id="circleInsertInterface" parameterType="map">
INSERT INTO interface_conclude_sign(
    interface_name,
    parent_interface_name,
    son_interface_name,
    interface_remark,
    catalog_name
) VALUES
<foreach collection="leadingInData" item="map_item" index="i" separator=",">
    (
        <foreach collection="map_item" item="list_item" index="j" separator=",">
            #{list_item}
        </foreach>
    )
</foreach>
excel 表格列(mapper excel 一对一):
接口名 父接口名 子接口名 接口备注 接口分类



标题: Java 实现导出Excel功能
文章地址:http://blog.youkuaiyun.com/u014266877/article/details/53691381
示例代码:
/**
 * @Description 会员资质审核数据导出
 * @author            <p style="color:#8e8e8e;font-family:微软雅黑;font-size=16px;font-weight:bold;">Cloud</p>
 * @date            <p style="color:#000;font-family:微软雅黑;font-size=16px;">2017-1-5上午10:16:59</p>
 * @param response        请求头信息
 * @param accountName        帐号
 * @param type            审核类型
 * @param userName        用户名
 * @param auditCode        审核状态
 * @param auditUser        审核帐号
 * @param realName        个人认证名称
 * @param companyName        企业认证名称
 * @param stDate        开始时间
 * @param enDate        结束时间
 * @throws Exception
 */
@RequestMapping(value = "/memberQualification")
@ResponseBody
public void memberQualification(HttpServletResponse response, String accountName, Integer type, String userName,
        Integer auditCode, String auditUser, String realName, String companyName, String stDate, String enDate) throws Exception{
    Map<String, String> paramMap = new HashMap<String, String>();
    // 导出条件
    if (accountName != null) {
        accountName = new String(accountName.getBytes("ISO-8859-1"), "utf-8");
        paramMap.put("accountName", accountName);
    }
    // 根据条件查询数据 默认为匹配数据前 5 万条 防止数据量超出大小 影响性能
    List<Membership> list = membershipQualificationServiceImpl.queryMembershipQualification(paramMap, 50000, 1);
    if(!list.isEmpty()){// 非空核验
        Map<String, Object> dataMap = new HashMap<String, Object>();
        dataMap.put("memberQualificaList", list);
        //导出数据
        exportDate(response, "会员资质审核", dataMap, 8);
    }else {
        logger.info("导出会员资质审核信息:导出数据为空");
    }
}

/**
 * @Description 导出数据公用方法
 * @author        <p style="color:#8e8e8e;font-family:微软雅黑;font-size=16px;font-weight:bold;">Cloud</p>
 * @date        <p style="color:#000;font-family:微软雅黑;font-size=16px;">2017-1-4下午1:56:57</p>
 * @param response    请求头信息
 * @param exportName    导出数据名称    
 * @param dataMap        导出数据
 * @param exportType    导出类型
 * @throws Exception    异常信息
 */
protected void exportDate(HttpServletResponse response, String exportName, Map<String, Object> dataMap, Integer exportType) throws Exception{
    // 第一步,创建一个webbook,对应一个Excel文件  
    HSSFWorkbook wb = new HSSFWorkbook();  
    // 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet  
    HSSFSheet sheet = wb.createSheet(exportName);  
    // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short  
    HSSFRow row = sheet.createRow((int) 0);
    // 第四步,设置样式
    HSSFCellStyle style = setHeadStyle(row, wb, 500, 10, HSSFFont.BOLDWEIGHT_BOLD);
    // 第五步,设置导出数据
    setExportDate(dataMap, sheet, row, style, exportType);
    // 第六步,弹出下载框
    popDownload(response, wb, exportName + "-" + Common.generateFileName(".csv"));
}
//详细代码参考我的博客;

标题: 添加修改方法集成, 严格分层 service dao mapper controller
/**
 * @Description        添加/修改岗位
 * @author        <p style="color:#8e8e8e;font-family:微软雅黑;font-size=16px;font-weight:bold;">Cloud</p>
 * @date        <p style="color:#000;font-family:微软雅黑;font-size=16px;">2016-12-20下午5:14:42</p>
 * @param request    请求头信息
 * @param quar        岗位信息
 * @return        成功/失败信息
 */
@RequestMapping(value = "saveQuarters")
@ResponseBody
public JSONObject saveQuarters(HttpServletRequest request, Quarters quar) {
    Integer res = 0;
    try {
        if (quar.getPost_id() != 0) {// 修改
            res = menuServiceImpl.updateQuarters(quar);
            res = (res > 0 ? 2 : 0);
        } else {// 添加
            User user = (User) request.getSession().getAttribute("USER");
            quar.setAdd_user(user.getUserId());
            res = menuServiceImpl.insertQuarters(quar);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    String returnCode = Common.getReturnCode(res, res);
    return JSONObject.fromObject(returnCode);
}



标题: 以写的更少, 做的更多的Jquery思想, 简化分页查询
简单写下SQL思路:
<!-- 查询支付宝充值记录 -->

<select id="queryAlipayRecharge" parameterType="map" resultType="com.chinadatapay.entity.PayMent">
    SELECT
        <if test="param.start == null and param.end == null">
            <!-- 分页    一个方法多用,既能统计数据,又能实现分页查询总数 -->
            SUM(money) money, COUNT(*) id
        </if>
        <if test="(param.start != null or param.start == 0) and (param.end != null or param.end == 0) ">
            *
        </if>
     FROM table
     <if test="(param.start != null or param.start == 0) and (param.end != null or param.end == 0)">
        ORDER BY memb.createTime DESC
        LIMIT #{param.start}, #{param.end}
    </if>
</select>
mapper dao service 各减少一个方法 在controller中对service进行再次调用:
/**
 * @Description    数据宝接口属性统计
 * @param    page    页码
 * @param    rows    页数
 * @param    account    帐户
 * @return
 */
@RequestMapping(value = "/interfaceAttrCount")
@ResponseBody
public Map<String, Object> interfaceAttrCount(Integer page, Integer rows,
        MembershipAccount account) {
    List<FinanceCount> incomeCount = new ArrayList<FinanceCount>();
    List<FinanceCount> incomeList = new ArrayList<FinanceCount>();
    Map<String, Object> map = new HashMap<String, Object>();
    try {
        //查询条件
        String interfaceName = account.getInterfaceName();
        if (Common.isNoEmpty(interfaceName)) {
            interfaceName = java.net.URLDecoder.decode(interfaceName,"utf-8");
            account.setInterfaceName(interfaceName);
        }
        //第一次调用 查询总条数 开始、结束 null 不会有 limit 分页
        account.setStart(null);
        account.setEnd(null);
        incomeCount = archiveCatalogServiceImpl.interfaceAttrCount(account);// 查询总条数
        if (page != null && rows != null) {
            account.setStart((page - 1) * rows);
            account.setEnd(rows);
        } else {// 默认分页参数
            account.setStart(0);
            account.setEnd(20);
        }
        //第二次调用 分页查询匹配记录 开始、结束 为传入值 limit 分页
        incomeList = archiveCatalogServiceImpl.interfaceAttrCount(account);
    } catch (Exception e) {
        e.printStackTrace();
    }
    map.put("total",(incomeCount != null && incomeCount.size() > 0) ? incomeCount.get(0).getInterfaceId() : 0);
    map.put("rows", incomeList);
    return map;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值