Springboot 资料分章原理+调试详解(自己学源码做项目的心路历程)

1.MyBatis逆向工程教程

https://blog.csdn.net/qq_41861558/article/details/100972934

2.springboot封装统一查询对象进行多条件查询案例

https://blog.csdn.net/qq_41358574/article/details/120986617

3.自动注解- 自动注解视频教程 -Java反射与自定义注解底层原理

https://www.bilibili.com/video/BV1ef4y1x794/?p=8&spm_id_from=pageDriver&vd_source=cc33f383cf7c5036af7b948bf7c1def1

3.1 自动分页查询jsh-erp程序流程:首先jsh使用的是统一封装查询进行的多条件查询,直接参考2。下面介绍一下软件运行流程

controller层
controller层
在这里插入图片描述
进入server
在这里插入图片描述
在这里实现不同的查询
在这里插入图片描述
进入接口
在这里插入图片描述
接着初始化的时候使用一个自定义注解 。在查询的时候返回一个IcomonQuery的接口 3跳到对应的自动注解。
在这里插入图片描述

4.jsh-erp 商品管理下面的商品信息无法list出来

原因是SELECT、HAVING、ORDER后的非聚合字段必须和GROUP BY后的字段保持完全一致。

查询源码报警如下

org.springframework.jdbc.BadSqlGrammarException: 
### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Expression #25 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'jsh_erp.me.bar_code' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
### The error may exist in file [D:\HS自开发软件\JSH_ERP-master\JSH_ERP-master\jshERP-boot\target\classes\mapper_xml\MaterialMapperEx.xml]
### The error may involve com.jsh.erp.datasource.mappers.MaterialMapperEx.selectByConditionMaterial-Inline
### The error occurred while setting parameters
### SQL: SELECT m.*, u.name unitName, mc.name categoryName, me.bar_code, me.purchase_decimal, me.commodity_decimal, me.wholesale_decimal, me.low_decimal, me.sku FROM jsh_material m LEFT JOIN jsh_material_extend me ON me.tenant_id = 63 AND m.id = me.material_id AND ifnull(me.delete_Flag, '0') != '1' LEFT JOIN jsh_unit u ON u.tenant_id = 63 AND m.unit_id = u.id AND ifnull(u.delete_Flag, '0') != '1' LEFT JOIN jsh_material_category mc ON mc.tenant_id = 63 AND m.category_id = mc.id AND ifnull(mc.delete_Flag, '0') != '1' WHERE m.tenant_id = 63 AND 1 = 1 AND (me.bar_code LIKE ? OR m.name LIKE ? OR m.standard LIKE ? OR m.model LIKE ?) AND m.category_id IN (?, ?) AND ifnull(m.delete_flag, '0') != '1' GROUP BY m.id ORDER BY m.id DESC LIMIT ?, ?
### Cause: java.sql.SQLSyntaxErrorException: Expression #25 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'jsh_erp.me.bar_code' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Expression #25 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'jsh_erp.me.bar_code' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

解决办法
临时解决办法:mysql新版本的问题,我的做法是在mysql conf文件中 在sql_mode里去掉only_full_group_by

在idea跳转到当前查询控制台输入`select @@global.sql_mode`查询当前模式有哪些,然后去掉only_full_group_by输入

```
set global sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
或者
set @@sql_mode=(select replace(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
```

永久解决办法:在ideamqsql控制台输入SHOW VARIABLES LIKE 'datadir';查看安装本地安装路径,接着在路径中修改my.ini
文件的sql-mode去掉only_full_group_by

5.update更新商品信息失败

在这里插入图片描述

解决方案:单步调试查询代码,在updateMaterial-》 materialExtendService.saveDetials-》saveDetials中

 if (null != deletedJson ) {
            StringBuffer bf=new StringBuffer();
            for (int i = 0; i < deletedJson.size(); i++) {
                bf.append(deletedJson.getString(i));
                if(i<(deletedJson.size()-1)){
                    bf.append(",");
                }
            }
            this.batchDeleteMaterialExtendByIds(bf.toString(), request);
        }

前面JSONArray deletedJson = obj.getJSONArray(“meDeleteIdList”);查询获取前端传入了一个deletedJson的json结构。发现这里面根本没有值deletedJson的size为0 但是依然进入了在上图的代码中。则在 for (int i = 0; i < deletedJson.size(); i++) 中0<0报警并且this.batchDeleteMaterialExtendByIds(bf.toString(), request);抛出异常给前端了修改为

 if (null != deletedJson && deletedJson.size()!=0) {
            StringBuffer bf=new StringBuffer();
            for (int i = 0; i < deletedJson.size(); i++) {
                bf.append(deletedJson.getString(i));
                if(i<(deletedJson.size()-1)){
                    bf.append(",");
                }
            }
            this.batchDeleteMaterialExtendByIds(bf.toString(), request);
        }

即可

6.若以框架使用代码生成添加子模块前端报错Error: Request failed with status code 404 No message available

分析原因:
自己设置修改了packageName: com.ruoyi.mes 原本为packageName: com.ruoyi.system
然后自己在com.ruyi下面加入了子模块mes ,虽然包路径也是ruoyi.com但是还是需要在RuoYiApplication上面添加@ComponentScan("com.ruoyi.*")
可以参考https://blog.csdn.net/ordinary_brony/article/details/138320696解决

7.ruoyi 框架添加表格多sheet导出

在需要导出的类上面加入

@ExcelIgnoreUnannotated
@ColumnWidth(16)
@HeadRowHeight(14)
@HeadFontStyle(fontHeightInPoints = 11)

变量上面修改原本的@@Excel(name= “入库单编号”) 为@ExcelProperty(value = "入库单编号")
修改controller的export函数

@PreAuthorize("@ss.hasPermi('warehouse:proPick:export')")
    @Log(title = "生产领料单", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, WmProductionPick wmProductionPick)
    {

        WmProductionPick wmProductionPick1=null;
        List<WmProductionPickEntry> wmProductionPickEntrys=null;
        List<WmProductionPickEntry> wmProductionPickEntryList= new ArrayList<>();
        List<WmProductionPick> list = wmProductionPickService.selectWmProductionPickList(wmProductionPick);
        ExcelUtil<WmProductionPick> util = new ExcelUtil<WmProductionPick>(WmProductionPick.class);

        for(int i=0;i<list.size();i++)
        {
            long id=list.get(i).getId();
            wmProductionPick= wmProductionPickService.selectWmProductionPickById(id);
            wmProductionPickEntrys=wmProductionPick.getWmProductionPickEntryList();
            wmProductionPickEntryList.addAll(wmProductionPickEntrys);
        }

        try {
            String fileName = "student";
            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();

            WriteSheet studentInfo = EasyExcel.writerSheet(0,"生产领料单数据")
                    .head(WmProductionPick.class).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                    .build();
            excelWriter.write(list,studentInfo);

            WriteSheet courseInfo = EasyExcel.writerSheet(1,"生产领料单子数据")
                    .head(WmProductionPickEntry.class).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                    .build();
            excelWriter.write(wmProductionPickEntryList,courseInfo);

            response.setContentType("application/vnd.ms-excel;charset=utf-8");
            response.setCharacterEncoding("UTF-8");
            response.setHeader("Content-Disposition","attachment;filename="+fileName+".xlsx");
            excelWriter.finish();
        }catch (IOException e){
            e.printStackTrace();
        }

    }

单文件导出可以使用ExcelUtil类中添加

public void exportEasyExcel(HttpServletResponse response, List<?> list, String sheetName)
    {
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");

        try
        {
            EasyExcel.write(response.getOutputStream(), clazz).sheet(sheetName).doWrite(list);
        }
        catch (IOException e)
        {
            log.error("导出EasyExcel异常{}", e.getMessage());
        }
    }

然后contlloer里面修改为exportEasyExcel导出函数即可

8.ruoyi 框架导入数据库生成代码时出现两个id
在这里插入图片描述
查询后问题出现在
在这里插入图片描述
where t.table_id = #{tableId} order by c.sort 改为where t.table_id = #{tableId} group by c.column_name,c.sort order by c.sort
去掉重复项

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值