编辑
2023-02-15
实用工具
00

1. nvl(expression1, expression2)🎃

函数作用:从两个表达式中返回一个非null值

用例:select nvl(father_name, mother_name) parent_name from student where student_id = '12345' 注意: 如果expression1的值非空,优先取expression1的值; 如果expression1的值空且expression2的值非空,则取expression2的值; 如果expression1和expression2均为空,则结果为NULL

2. decode(field_name, value1, new_value1, value2, new_value2, default_value)

函数作用:类似if...else...语句块,针对某个字段,如果它的值为value1,则转换为newValue1,如果值为value2,则转换为newValue2,其他情况显示默认值

用例:select decode(id,'1','A','2','B',id) from A; 注意: decode(field_name, value1, new_value1, value2, new_value2, default_value)其中的value1,newValue1等可以是一个表达式

3. row_number(order by field_name)

函数作用:将数据集按照某个字段排序,并产生序号字段

用例:select row_number() over(order by name) no,id,name from a;

4. to_date(source_string, formater_string)

函数作用:将字符串转换为日期类型

用例:select to_date('20190809','yyyyMMdd') from dual; 注意: 'yyyyMMdd','yyyymmdd','yyyy-MM-dd','yyyy-mm-dd'都可以

5. to_char()

函数作用:将其他类型转换为字符串类型

用例1:select to_char(sysdate, 'yyyymmdd') from dual 用例2:select to_char(99, 'fm999.00') from dual 注意: 用例1中还有很多其他的日期格式,如yyyy,mm,dd,D,DD,DDD等 用例2中fm,9,0都有不同的含义,如下表所示
字符标志含义
9如果存在数字则显示数字,不存在则显示空格
0如果存在数字则显示数字,不存在则显示0,即占位符
编辑
2023-02-10
实用工具
00

简介🍈

Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。 easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便.

官方地址

导入meaven

<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.2.0</version> </dependency>

读Excel

/** * 最简单的读 * <p>1. 创建excel对应的实体对象 参照{@link DemoData} * <p>2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link DemoDataListener} * <p>3. 直接读即可 */ @Test public void simpleRead() { String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx"; // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭 EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead(); }

写Excel

/** * 最简单的写 * <p>1. 创建excel对应的实体对象 参照{@link com.alibaba.easyexcel.test.demo.write.DemoData} * <p>2. 直接写即可 */ @Test public void simpleWrite() { String fileName = TestFileUtil.getPath() + "write" + System.currentTimeMillis() + ".xlsx"; // 这里 需要指定写用哪个class去读,然后写到第一个sheet,名字为模板 然后文件流会自动关闭 // 如果这里想使用03 则 传入excelType参数即可 EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data()); }
编辑
2023-02-10
实用工具
00

1.使用list循环查询👍

代码展示:

xml
<if test="request.sendOutStatus !=null and request.sendOutStatus.size()>0"> AND b.send_out_status IN <foreach collection="request.sendOutStatus" index="index" item="item" open="(" separator="," close=")" > #{item} </foreach> </if>

先在if里判断长度和是不是满足自己需要的数据,然后遍历列表,把符合条件的进行组装,最后大概相当于

AND b.send_out_status IN (1,2,3)

遍历中再次判断

xml
<if test="request.sendOutStatus !=null and request.sendOutStatus.size()>0"> AND ( b.send_out_status IN <foreach collection="request.sendOutStatus" index="index" item="item" open="(" separator="," close=")"> #{item} </foreach> <foreach collection="request.sendOutStatus" index="index" item="item" > <choose> <when test='item == "0"'> or b.send_out_status is null </when> </choose> </foreach> ) </if>

第二种比第一种稍微进阶一点点,首先就是普通的遍历,然后再执行一次遍历,然后再拼接起来,因为有时候单次遍历不能满足条件,choose就是选择的意思,当遍历中有满足条件的就是执行一下 如果状态为零就相当于

AND b.send_out_status IN (1,2,3) or b.send_out_status is null

不为零则还是普通的方式

AND b.send_out_status IN (1,2,3)

foreach中除了choose以为还有otherwise等选择判断的方式

编辑
2023-02-09
学习记录
00

Synchronized 和 Lock的概念主要概念🍑

Synchronized 是Java 并发编程中很重要的关键字,另外一个很重要的是 volatile。Syncronized 的目的是一次只允许一个线程进入由他修饰的代码段,从而允许他们进行自我保护。Synchronized 很像生活中的锁例子,进入由Synchronized 保护的代码区首先需要获取 Synchronized 这把锁,其他线程想要执行必须进行等待。Synchronized 锁住的代码区域执行完成后需要把锁归还,也就是释放锁,这样才能够让其他线程使用。

Lock 是 Java并发编程中很重要的一个接口,它要比 Synchronized 关键字更能直译"锁"的概念,Lock需要手动加锁和手动解锁,一般通过 lock.lock() 方法来进行加锁, 通过 lock.unlock() 方法进行解锁。与 Lock 关联密切的锁有 ReetrantLock 和 ReadWriteLock。

ReetrantLock 实现了Lock接口,它是一个可重入锁,内部定义了公平锁与非公平锁。

ReadWriteLock 一个用来获取读锁,一个用来获取写锁。也就是说将文件的读写操作分开,分成2个锁来分配给线程,从而使得多个线程可以同时进行读操作。ReentrantReadWirteLock实现了ReadWirteLock接口,并未实现Lock接口。

Synchronized 和 Lock 的使用

下面是 Synchronized 的例子:

在方法上使用 Synchronized 方法声明时使用,放在范围操作符之后,返回类型声明之前。即一次只能有一个线程进入该方法,其他线程要想在此时调用该方法,只能排队等候。

private int number; public synchronized void numIncrease(){ number++; } 复制 在某个代码段使用 Synchronized 你也可以在某个代码块上使用 Synchronized 关键字,表示只能有一个线程进入某个代码段。 public void numDecrease(Object num){ synchronized (num){ number++; } } 复制 使用 Synchronized 锁住整个对象 synchronized后面括号里是一对象,此时线程获得的是对象锁。 public void test() { synchronized (this) { // ... } }
编辑
2023-02-07
学习记录
00

什么是跨域问题?

跨域问题指的是不同站点之间,使用 ajax 无法相互调用的问题。跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。 但这个保护机制也带来了新的问题,它的问题是给不同站点之间的正常调用,也带来的阻碍,那怎么解决这个问题呢?接下来我们一起来看。

1.跨域三种情况

在请求时,如果出现了以下情况中的任意一种,那么它就是跨域请求:

  • 协议不同,如 http 和 https;
  • 域名不同;
  • 端口不同。 也就是说,即使域名相同,如果一个使用的是 http,另一个使用的是 https,那么它们也属于跨域访问。

解决跨域问题

在 Spring Boot 中跨域问题有很多种解决方案,比如以下 5 个:

  • 使用 @CrossOrigin 注解实现跨域;
  • 通过配置文件实现跨域;
  • 通过 CorsFilter 对象实现跨域;
  • 通过 Response 对象实现跨域;
  • 通过实现 ResponseBodyAdvice 实现跨域。