Halo(十)

Spring Converter(转换器)

@FunctionalInterface
public interface Converter {  //一对一转换
    @Nullable
    T convert(S source);
}

该接口非常简单,只定义了一个转换方法,两个泛型参数则是需要转换的两个类型。
在单独处理两个类型的转换时这是首选,即一对一。


但是倘若有同一父类(或接口)的类型需要进行类型转化,为每个类型都写一个Converter显然是十分不理智的。
对于这种情况,Spring提供了一个ConverterFactory接口。

public interface ConverterFactory {   //一对多转换
     Converter getConverter(Class targetType);
}

字符串转换成枚举类

public class StringToEnumConverterFactory implements ConverterFactory {

    @SuppressWarnings("unchecked")
    @Override
    public  Converter getConverter(Class targetType) {
        return new StringToEnumConverter(targetType);
    }

    private static class StringToEnumConverter
            implements Converter {

        private Class enumType;

        private StringToEnumConverter(Class enumType) {
            this.enumType = enumType;
        }

        @SuppressWarnings("unchecked")
        @Override
        public T convert(String source) {
            return (T) Enum.valueOf(this.enumType, source.toUpperCase());
        }
    }
}


注册转换器:

    public class WebMvcAutoConfiguration implements WebMvcConfigurer {
        @Override
        public void addFormatters(FormatterRegistry registry) {
            registry.addConverterFactory(new StringToEnumConverterFactory());
        }
    }

Hibernate 继承映射

单表继承映射(一张表)

每个子类对应一张表的继承映射(两张表)

每个类对应一张表的继承映射(三张表)

三种映射方式的比较:

  第一种方式,只有一张表,数据冗余较多,但查询效率高,数据量不是非常大的时候,推荐使用。

  第二种方式,每个子类对应一张表,数据冗余比较少,查询效率不高,主键不能设置成自增。

  第三种方式,每个类对应一张表,数据冗余较少,查询效率比第二种方式稍高,需要维护的表的个数较多。

Signal Table 多个entity对应同一张表,用一个字段区分(第一种方式)

//定义辨别者列的列名为person_type,列类型为字符串
@DiscriminatorColumn(name="person_type", discriminatorType=DiscriminatorType.STRING)
//指定该实体对应的记录在辨别者列的值为"person"
@DiscriminatorValue("普通人")
public class Person


@DiscriminatorValue("顾客")
public class Customer extends Person

@DiscriminatorValue("员工")
public class Employee extends Person


/** 基础评论 Entity */
@Data
@Entity(name = "BaseComment")
@Table(name = "comments")
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.INTEGER, columnDefinition = "int default 0")
public class BaseComment extends BaseEntity {}


@Entity(name = "PostComment")
@DiscriminatorValue("0")
public class PostComment extends BaseComment {}

@Entity(name = "SheetComment")
@DiscriminatorValue("1")
public class SheetComment extends BaseComment {}

@Entity(name = "JournalComment")
@DiscriminatorValue("2")
public class JournalComment extends BaseComment {}

Spring Boot 解析 YAML

server:
    name: app
    address:
        - 192.168.1.1
        - 192.168.1.2

@Component
@ConfigurationProperties(prefix = "server")
public class Properties {
    private String name;
    private List address = new ArrayList<>();
}


server:
    list:
      - name: app1
        address:
            - 10.11.1.1
            - 10.11.1.2
      - name: app2
        address:
            - 10.10.1.1
            - 10.10.1.2

@Component
@ConfigurationProperties(prefix = "server")
public class Properties {
    private List list = new ArrayList<>();
}
public class Ld {
    private String name;
    private List address = new ArrayList<>();
}


或者


/** YAML文件转换器 */
public interface ThemePropertyResolver {
    ThemeProperty resolve(String content) throws IOException;
}

@Service
public class YamlThemePropertyResolver implements ThemePropertyResolver {

    private final ObjectMapper yamlMapper;

    public YamlThemePropertyResolver() {
        yamlMapper = new ObjectMapper(new YAMLFactory());
        //未知属性不报错
        yamlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    }

    @Override
    public ThemeProperty resolve(String content) throws IOException {
        return yamlMapper.readValue(content, ThemeProperty.class);
    }
}

@Data
public class ThemeProperty {
    private String id;
    private String name;

    @Data
    public static class Author {
        private String name;
        private String website;
    }
}

id: ld
name: ld
author:
  name: ld
  website: https://

你可能感兴趣的:(Halo(十))