编程大杂烩(三)

本文是一篇综合性的Java与Spring Boot技术博客,涵盖了多种实用知识点,包括double转int的四舍五入、SQL函数用法、时间比较、FeignClient注解解析、Spring Boot配置控制、maven插件选择、Fastjson使用、处理器核心数获取、InputStream异常处理、接口多实现选择、全局异常处理、配置处理器使用、Minio的安装与Spring Boot整合、MySQL IN与EXISTS的区别、Java中transient关键字的应用和Socket通信流程。内容详实,适合开发者参考学习。
摘要由CSDN通过智能技术生成

编程大杂烩(三)

39.double转int并四舍五入

public static void main(String[] args) {
   
    System.out.println("向上取整:" + (int) Math.ceil(96.1));// 97 (去掉小数凑整:不管小数是多少,都进一)
    System.out.println("向下取整" + (int) Math.floor(96.8));// 96 (去掉小数凑整:不论小数是多少,都不进位)
    System.out.println("四舍五入取整:" + Math.round(96.1));// 96 (这个好理解,不解释)
    System.out.println("四舍五入取整:" + Math.round(96.8));// 97
}

40.sql的to_date()函数

参考链接:https://blog.csdn.net/keyuzhang/article/details/89473384

-- 日期例子:
SELECT TO_DATE('2006-05-01 19:25:34', 'YYYY-MM-DD HH24:MI:SS') 

SELECT TO_DATE('2006-05-01 19:25', 'YYYY-MM-DD HH24:MI') 

SELECT TO_DATE('2006-05-01 19', 'YYYY-MM-DD HH24')

SELECT TO_DATE('2006-05-01', 'YYYY-MM-DD') 

SELECT TO_DATE('2006-05', 'YYYY-MM') 

SELECT TO_DATE('2006', 'YYYY') 

日期格式 
格式控制 描述 
YYYY、YYY、YY 分别代表4位、3位、2位的数字年 
YEAR 年的拼写 
MM 数字月 
MONTH 月的全拼 
MON 月的缩写 
DD 数字日 
DAY 星期的全拼 
DY 星期的缩写 
AM 表示上午或者下午 
HH24、HH12 12小时制或24小时制 
MI 分钟 
SS 秒钟 
SP 数字的拼写 
TH 数字的序数词

日期说明: 
当省略HH、MI和SS对应的输入参数时,Oracle使用0作为DEFAULT值。
如果输入的日期数据忽略时间部分,Oracle会将时、分、秒部分都置为0,也就是说会取整到日。

同样,忽略了DD参数,Oracle会采用1作为日的默认值,也就是说会取整到月。

但是,不要被这种“惯性”所迷惑,如果忽略MM参数,Oracle并不会取整到年,取整到当前月。

注意: 
1.在使用Oracle的to_date函数来做日期转换时,可能会直觉地采用“yyyy-MM-dd HH:mm:ss”的格式
作为格式进行转换,但是在Oracle中会引起错误:“ORA 01810 格式代码出现两次”。如:

select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mm:ss') from dual;
原因是SQL中不区分大小写,MM和mm被认为是相同的格式代码,所以Oracle的SQL采用了mi代替分钟。
select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mi:ss') from dual;

2.另要以24小时的形式显示出来要用HH24

select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;//mi是分钟
select to_char(sysdate,'yyyy-MM-dd HH24:mm:ss') from dual;//mm会显示月份

例子:
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual; //日期转化为字符串   
select to_char(sysdate,'yyyy') as nowYear   from dual;   //获取时间的年   
select to_char(sysdate,'mm')    as nowMonth from dual;   //获取时间的月   
select to_char(sysdate,'dd')    as nowDay    from dual;   //获取时间的日   
select to_char(sysdate,'hh24') as nowHour   from dual;   //获取时间的时   
select to_char(sysdate,'mi')    as nowMinute from dual;   //获取时间的分   
select to_char(sysdate,'ss')    as nowSecond from dual;   //获取时间的秒 

求某天是星期几:
 select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual;      
   星期一      
   select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;      
   monday      
   设置日期语言      
   ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';      
   也可以这样      
   TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American')    
   
两个日期间的天数:
select floor(sysdate - to_date('20020405','yyyymmdd')) from dual;   

41.sql的position函数

参考链接:http://www.yiidian.com/sql/position-function-in-sql.html

示例

示例 1:以下 SELECT 查询显示字符 S 在原始字符串中的位置:

SELECT POSITION('S' IN 'SUSTAINABLE')AS POSITION_S; 

输出结果为:

POSITION_S
1

示例 2:以下 SELECT 查询显示 DELHI 单词在给定字符串中的位置:

SELECT POSITION( 'DELHI' IN 'NEW DELHI') AS POSITION_DELHI;  

输出结果为:

POSITION_DELHI
5

42.时间比较大小compareTo

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = format.parse(format.format(new Date())); // 当前时间为2022-07-26
Date date1 = format.parse("2022-07-26");
System.out.println("当前时间:"+date); //当前时间:Sun Apr 17 00:00:00 CST 2022
System.out.println("输入比较时间:"+date1);//输入比较时间:Sat Apr 16 00:00:00 CST 2022

// date.compareTo(date1)
// 如果指定的数与参数相等返回 0。(date1等于date)
// 如果指定的数大于参数返回 1。(date1小于date)
// 如果指定的数小于参数返回 -1。(date1大于date)
System.out.println(date.compareTo(date1));//0

Date date2 = format.parse("2022-07-25");
System.out.println(date.compareTo(date2));//1

Date date3 = format.parse("2022-07-27");
System.out.println(date.compareTo(date3));//-1

43.@FeignClient注解理解

————————————————
版权声明:本文为CSDN博主「Heart_B」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hearth_b/article/details/107573332

Feign基本介绍

首先来个基本的普及,怕有些同学还没接触过Spring Cloud。Feign是Netflix开源的一个REST客户端,通过定义接口,使用注解的方式描述接口的信息,就可以发起接口调用。

GitHub地址:https://github.com/OpenFeign/feign

下面是GitHub主页上给的一个最基本的使用示列,示列中采用Feign调用GitHub的接口。

interface GitHub {
   
    @RequestLine("GET /repos/{owner}/{repo}/contributors")
    List<Contributor> contributors(@Param("owner") String owner, @Param("repo") String repo);

    @RequestLine("POST /repos/{owner}/{repo}/issues")
    void createIssue(Issue issue, @Param("owner") String owner, @Param("repo") String repo);

}

public static class Contributor {
   
    String login;
    int contributions;
}

public static class Issue {
   
    String title;
    String body;
    List<String> assignees;
    int milestone;
    List<String> labels;
}

public class MyApp {
   
    public static void main(String... args) {
   
        GitHub github = Feign.builder()
            .decoder(new GsonDecoder())
            .target(GitHub.class, "https://api.github.com");

        // Fetch and print a list of the contributors to this library.
        List<Contributor> contributors = github.contributors("OpenFeign", "feign");
        for (Contributor contributor : contributors) {
   
            System.out.println(contributor.login + " (" + contributor.contributions + ")");
        }
    }
}

Spring Cloud OpenFeign介绍

Spring Cloud OpenFeign是Spring Cloud团队将原生的Feign结合到Spring Cloud中的产物。从上面原生Feign的使用示列来看,用的注解都是Feign中自带的,但我们在开发中基本上都是基于Spring MVC的注解,不是很方便调用。所以Spring Cloud OpenFeign扩展了对Spring MVC注解的支持,同时还整合了Ribbon和Eureka来提供均衡负载的HTTP客户端实现。

GitHub地址:https://github.com/spring-cloud/spring-cloud-openfeign

官方提供的使用示列:

@FeignClient("stores")
public interface StoreClient {
   
    @RequestMapping(method = RequestMethod.GET, value = "/stores")
    List<Store> getStores();

    @RequestMapping(method = RequestMethod.POST, value = "/stores/{storeId}", consumes = "application/json")
    Store update(@PathVariable("storeId") Long storeId, Store store);
}

FeignClient注解的使用介绍

value, name

value和name的作用一样,如果没有配置url那么配置的值将作为服务名称,用于服务发现。反之只是一个名称。

serviceId

serviceId已经废弃了,直接使用name即可。

contextId

比如我们有个user服务,但user服务中有很多个接口,我们不想将所有的调用接口都定义在一个类中,比如:

Client 1

@FeignClient(name = "optimization-user")
public interface UserRemoteClient {
   
	@GetMapping("/user/get")
	public User getUser(@RequestParam("id") int id);
}

Client 2

@FeignClient(name = "optimization-user")
public interface UserRemoteClient2 {
   
	@GetMapping("/user2/get")
	public User getUser(@RequestParam("id") int id);
}

这种情况下启动就会报错了,因为Bean的名称冲突了,具体错误如下:

Description:
The bean 'optimization-user.FeignClientSpecification', defined in null, could not be registered. A bean with that name has already been defined in null and overriding is disabled.
Action:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true

解决方案可以增加下面的配置,作用是允许出现beanName一样的BeanDefinition。

spring.main.allow-bean-definition-overriding=true

另一种解决方案就是为每个Client手动指定不同的contextId,这样就不会冲突了。

上面给出了Bean名称冲突后的解决方案,下面来分析下contextId在Feign Client的作用,在注册Feign Client Configuration的时候需要一个名称,名称是通过getClientName方法获取的:

String name = getClientName(attributes);

registerClientConfiguration(registry, name, attributes.get("configuration"));
private String getClientName(Map<String, Object> client) {
   
    if (client == null) {
   
      return null;
    }
    String value = (String) client.get("contextId");
    if (!StringUtils.hasText(value)) {
   
      value = (String) client.get("value");
    }
    if (!StringUtils.hasText(value)) {
   
      value = (String) client.get("name");
    }
    if (!StringUtils.hasText(value)) {
   
      value = (String) client.get("serviceId");
    }
    if (StringUtils.hasText(value)) {
   
      return value;
    }

    throw new IllegalStateException("Either 'name' or 'value' must be provided in @"
        + FeignClient.class.getSimpleName());
}

可以看到如果配置了contextId就会用contextId,如果没有配置就会去value然后是name最后是serviceId。默认都没有配置,当出现一个服务有多个Feign Client的时候就会报错了。

其次的作用是在注册FeignClient中,contextId会作为Client 别名的一部分,如果配置了qualifier优先用qualifier作为别名。

private void registerFeignClient(BeanDefinitionRegistry registry,
                                 AnnotationMetadata annotationMetadata, Map<String, Object> attributes) {
   
    String className = annotationMetadata.getClassName();
    BeanDefinitionBuilder definition = BeanDefinitionBuilder
        .genericBeanDefinition(FeignClientFactoryBean.class);
    validate(attributes
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值