一. SpringBoot(返回cookies信息的get接口开发)
1. 新建main方法
在java文件夹下,新建一个Application类
建立一个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
编辑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
二. 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”
如果cookies信息与预期值不同,会返回“cookies信息错误”
如果cookies信息与预期值一致,会返回访问/getwithcookies接口成功
三. 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 以上的版本才有的一个将指定列名的多行查询结果,用 指定的分割符号 合并成一行显示:
例如:
表原始数据:
需求:将 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 进行查询后,对查询结果乱码问题进行转码处理;
运行后的结果:
我在森林消防网站中使用的
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
六. 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;