210407:返回/携带cookies信息的get接口开发--SpringBoot设置cookie存留时间-Java分批下载大文件-Oracle中两条记录合并为一条记录-SQL中使用to_char报错

一. SpringBoot(返回cookies信息的get接口开发)

1. 新建main方法

在java文件夹下,新建一个Application类

210407:返回/携带cookies信息的get接口开发--SpringBoot设置cookie存留时间-Java分批下载大文件-Oracle中两条记录合并为一条记录-SQL中使用to_char报错_第1张图片

建立一个main方法,用于接口方法的执行

@SpringBootApplication
@ComponentScan("com.course.server")   //com.course.server是要执行的包名
public class Application {
    public static void main(String[] args){
        SpringApplication.run(Application.class,args);
    }
}

2. 新建接口

java目录下,新建一个package,包名com.course.server(与步骤1中代码注释部分保持一致),然后在包下新建一个类 MyGetMethod

210407:返回/携带cookies信息的get接口开发--SpringBoot设置cookie存留时间-Java分批下载大文件-Oracle中两条记录合并为一条记录-SQL中使用to_char报错_第2张图片

编辑get接口 /getcookies

@RestController
public class MyGetMethod {

    @RequestMapping(value = "/getcookies",method = RequestMethod.GET)
    public String getCookies(HttpServletResponse response){
        //HttpServerletRequest  装请求信息的类
        //HttpServerletResponse  装相应信息的类
        Cookie cookie = new Cookie("login","true");
        response.addCookie(cookie);
        return "恭喜获得cookies信息成功";
    }
}

然后访问/getcookies接口,理论上会返回一段{“login”:“true”}的cookie信息和"恭喜获得cookies信息成功"的文本信息
然后浏览器直接访问:http://localhost:9527/getcookies,可以看到接口调用成功,并且cookie中能看到login=true

210407:返回/携带cookies信息的get接口开发--SpringBoot设置cookie存留时间-Java分批下载大文件-Oracle中两条记录合并为一条记录-SQL中使用to_char报错_第3张图片

二. SpringBoot(携带cookies信息访问的get接口开发)

基础配置已在上篇文章中进行了详细描述,本篇不做过多叙述,以下代码直接贴在MyGetMethod文件中
RequestMapping部分保持不变
for (Cookie cookie:cookies)内的部分,对取到的cookies信息做校验

@RequestMapping(value = "/getwithcookies",method = RequestMethod.GET)
    public String getWithCookies(HttpServletRequest request){

        Cookie[] cookies = request.getCookies();
        if (Objects.isNull(cookies)){
            return "cookies信息为null";
        }
        for (Cookie cookie:cookies){
            if (cookie.getName().equals("login")&&cookie.getValue().equals("true")){
                return "访问/getwithcookies接口成功";
            }
        }
        return "cookies信息错误";
    }

Rerun Application文件,然后使用postman访问localhost:9527/getwithcookies接口
如果未携带cookies,会返回“cookies信息为null”

210407:返回/携带cookies信息的get接口开发--SpringBoot设置cookie存留时间-Java分批下载大文件-Oracle中两条记录合并为一条记录-SQL中使用to_char报错_第4张图片

如果cookies信息与预期值不同,会返回“cookies信息错误”

210407:返回/携带cookies信息的get接口开发--SpringBoot设置cookie存留时间-Java分批下载大文件-Oracle中两条记录合并为一条记录-SQL中使用to_char报错_第5张图片

如果cookies信息与预期值一致,会返回访问/getwithcookies接口成功

210407:返回/携带cookies信息的get接口开发--SpringBoot设置cookie存留时间-Java分批下载大文件-Oracle中两条记录合并为一条记录-SQL中使用to_char报错_第6张图片

三. SpringBoot中设置cookie存留时间

server.servlet.session.cookie.max-age=3600

四. Java分批下载大文件

import java.util.* ;
import java.io.* ;
public class Demo {
    public static void main(String args[]) throws Exception{
        int i ;
        byte[] b = new byte[1024*1024];
        File file = new File("mysql-5.7.28-winx64.zip");
        System.out.println(file.length());
        // FileInputStream f = new FileInputStream(file);
        // FileOutputStream o = new FileOutputStream("b.zip");
        // while( (i = f.read(b)) != -1 ) {
            // o.write(b,0,i);
        // }        
            
    }
    
}

五. Oracle中两条记录合并为一条记录

需求:一篇文章会发布到多个栏目下,一个栏目是一条记录,所以同一个文章有多个栏目只有栏目字段值不一样,要用|让栏目合并到一起作为一条记录展示

1. 聚合函数LISTAGG

LISTAGG(列名,'分割符号')

oracle 11g 以上的版本才有的一个将指定列名的多行查询结果,用 指定的分割符号 合并成一行显示:

例如:

表原始数据:

210407:返回/携带cookies信息的get接口开发--SpringBoot设置cookie存留时间-Java分批下载大文件-Oracle中两条记录合并为一条记录-SQL中使用to_char报错_第7张图片

需求:mb1_Transport_License_list 表中的数据,根据 transportation_license_id 数据进行分组,对 Item_Category_Name列的数据进行 去重合并

SELECT transportation_license_id,
     LISTAGG( to_char(Item_Category_Name), ',') WITHIN GROUP(ORDER BY Item_Category_Name) AS employees
      FROM ( select distinct transportation_license_id, item_category_name from mb1_Transport_License_list  ) group by transportation_license_id

SQL解析:

select distinct transportation_license_id, item_category_name from mb1_Transport_Lincense_list

-- 对需要做合并处理的数据源数据进行去重处理,如果实际要求不需要去重处理,这里可以直接改为 表名,如下去查询:

from mb1_Transport_Lincense_list
LISTAGG( to_char(Item_Category_Name), ',') WITHIN GROUP(ORDER BY Item_Category_Name)

将 Item_Category_Name 列的内容以,进行分割合并、排序;

to_char(Item_Category_Name) -- to_char(列名) 解决使用聚合函数 LISTAGG 进行查询后,对查询结果乱码问题进行转码处理;

运行后的结果:

210407:返回/携带cookies信息的get接口开发--SpringBoot设置cookie存留时间-Java分批下载大文件-Oracle中两条记录合并为一条记录-SQL中使用to_char报错_第8张图片

我在森林消防网站中使用的

SELECT 
    DISTINCT    A.ID,A.lm lmmc,TO_CHAR(SUBSTR(b.wznr,1,2000)) wznr,b.fbrmc,b.fbdwmc,to_char(b.fbsj,'yyyy-MM-dd  HH:mm:ss') fbsj,b.WZLX,b.WZZT,b.zdmc,b.CREATE_USER create_user, 
    b.CREATE_DEPT create_dept,b.sbm_code,b.SPRXM,b.FBT,b.STATE,b.SYR,b.LXDH,b.TGR,b.TGDW,b.RC,b.URL,b.TJSPSJ,b.spsj,b.CREATE_TIME create_time,b.UPDATE_DEPT,    
    b.UPDATE_TIME,b.UPDATE_USER,b.DELETE_DEPT,b.DELETE_TIME,b.DELETE_USER,b.IS_DELETE
FROM
    (
        SELECT
            ERT. ID ID,LISTAGG (TO_CHAR(men.mc), '|') WITHIN GROUP (ORDER BY men.mc) lm
        FROM
            T_SLXF_ERTICLE ert
        LEFT JOIN T_SLXF_ARTICRELEASE art ON ERT."ID" = ART.WZ_ID and art.is_delete = '0'
        LEFT JOIN T_SLXF_MENU men ON art.lm_id = men. ID
        WHERE
            ert.is_delete = '0'
        GROUP BY
            ert. ID
    ) A
LEFT JOIN (
    SELECT
        sit.zdmc,ert.*
    FROM
        T_SLXF_ERTICLE ert
    LEFT JOIN T_SLXF_ARTICRELEASE art ON ERT."ID" = ART.WZ_ID and art.is_delete = '0'
    LEFT JOIN T_SLXF_MENU men ON art.lm_id = men. ID
    LEFT JOIN T_SLXF_SITEINFO sit ON art.zd_id = sit. ID
) b ON A . ID = b. ID
210407:返回/携带cookies信息的get接口开发--SpringBoot设置cookie存留时间-Java分批下载大文件-Oracle中两条记录合并为一条记录-SQL中使用to_char报错_第9张图片

六. SQL中使用to_char报错

信息:ORA-22835:缓冲区对于CLOB到CHAR转换而言太小

1. 错误发生场景

在对视图中的CLOB进行to_char处理后,在CLOB字段录入字段信息小于4000字符时,查询正常,但当录入字符大于4000字符时,就会该错误。

错误提示:ORA-22835:缓冲区对于CLOB到CHAR转换或BLOB到RAWZ转换而言太小。

2. 原因分析

在对CLOB进行的TO_CHAR处理,可以理解为将CLOB中存储的信息转换成varchar2,然后在进行展现,大家都知道对于varchar2来言,最多存储4000个字符,当超出4000字符时,就报错了。

错误的大致意思就是超出了varchar2的缓冲大小。

3. 解决方案

对CLOB字段进行截取,使其在TO_CHAR之前获取的数据小于4000字符,这样在进行TO_CHAR时就不会报错了。

截取SQL如下:SUBSTR(column,1,4000)

需要注意一点,如果是大字段中存在汉字,则需要将汉字所占字节数考虑进入,如一个汉字占2个字节,实际截取字节数为2000。

截取SQL:SUBSTR(column,1,2000)。

对CLOB大字段处理的完整SQL如下:

TO_CHAR( SUBSTR(column,1,2000))  as column;

你可能感兴趣的:(210407:返回/携带cookies信息的get接口开发--SpringBoot设置cookie存留时间-Java分批下载大文件-Oracle中两条记录合并为一条记录-SQL中使用to_char报错)