Spring Converter(转换器)

  1. @FunctionalInterface
  2. public interface Converter<S, T> { //一对一转换
  3. @Nullable
  4. T convert(S source);
  5. }
  6. 该接口非常简单,只定义了一个转换方法,两个泛型参数则是需要转换的两个类型。
  7. 在单独处理两个类型的转换时这是首选,即一对一。
  8. 但是倘若有同一父类(或接口)的类型需要进行类型转化,为每个类型都写一个Converter显然是十分不理智的。
  9. 对于这种情况,Spring提供了一个ConverterFactory接口。
  10. public interface ConverterFactory<S, R> { //一对多转换
  11. <T extends R> Converter<S, T> getConverter(Class<T> targetType);
  12. }

字符串转换成枚举类

  1. public class StringToEnumConverterFactory implements ConverterFactory<String, Enum> {
  2. @SuppressWarnings("unchecked")
  3. @Override
  4. public <T extends Enum> Converter<String, T> getConverter(Class<T> targetType) {
  5. return new StringToEnumConverter(targetType);
  6. }
  7. private static class StringToEnumConverter<T extends Enum>
  8. implements Converter<String, T> {
  9. private Class<T> enumType;
  10. private StringToEnumConverter(Class<T> enumType) {
  11. this.enumType = enumType;
  12. }
  13. @SuppressWarnings("unchecked")
  14. @Override
  15. public T convert(String source) {
  16. return (T) Enum.valueOf(this.enumType, source.toUpperCase());
  17. }
  18. }
  19. }
  20. 注册转换器:
  21. public class WebMvcAutoConfiguration implements WebMvcConfigurer {
  22. @Override
  23. public void addFormatters(FormatterRegistry registry) {
  24. registry.addConverterFactory(new StringToEnumConverterFactory());
  25. }
  26. }

Hibernate 继承映射

  1. 单表继承映射(一张表)
  2. 每个子类对应一张表的继承映射(两张表)
  3. 每个类对应一张表的继承映射(三张表)
  4. 三种映射方式的比较:
  5.   第一种方式,只有一张表,数据冗余较多,但查询效率高,数据量不是非常大的时候,推荐使用。
  6.   第二种方式,每个子类对应一张表,数据冗余比较少,查询效率不高,主键不能设置成自增。
  7.   第三种方式,每个类对应一张表,数据冗余较少,查询效率比第二种方式稍高,需要维护的表的个数较多。

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

  1. //定义辨别者列的列名为person_type,列类型为字符串
  2. @DiscriminatorColumn(name="person_type", discriminatorType=DiscriminatorType.STRING)
  3. //指定该实体对应的记录在辨别者列的值为"person"
  4. @DiscriminatorValue("普通人")
  5. public class Person
  6. @DiscriminatorValue("顾客")
  7. public class Customer extends Person
  8. @DiscriminatorValue("员工")
  9. public class Employee extends Person
  10. /** 基础评论 Entity */
  11. @Data
  12. @Entity(name = "BaseComment")
  13. @Table(name = "comments")
  14. @DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.INTEGER, columnDefinition = "int default 0")
  15. public class BaseComment extends BaseEntity {}
  16. @Entity(name = "PostComment")
  17. @DiscriminatorValue("0")
  18. public class PostComment extends BaseComment {}
  19. @Entity(name = "SheetComment")
  20. @DiscriminatorValue("1")
  21. public class SheetComment extends BaseComment {}
  22. @Entity(name = "JournalComment")
  23. @DiscriminatorValue("2")
  24. public class JournalComment extends BaseComment {}

Spring Boot 解析 YAML

  1. server:
  2. name: app
  3. address:
  4. - 192.168.1.1
  5. - 192.168.1.2
  6. @Component
  7. @ConfigurationProperties(prefix = "server")
  8. public class Properties {
  9. private String name;
  10. private List<String> address = new ArrayList<>();
  11. }
  12. server:
  13. list:
  14. - name: app1
  15. address:
  16. - 10.11.1.1
  17. - 10.11.1.2
  18. - name: app2
  19. address:
  20. - 10.10.1.1
  21. - 10.10.1.2
  22. @Component
  23. @ConfigurationProperties(prefix = "server")
  24. public class Properties {
  25. private List<Ld> list = new ArrayList<>();
  26. }
  27. public class Ld {
  28. private String name;
  29. private List<String> address = new ArrayList<>();
  30. }
  31. 或者
  32. /** YAML文件转换器 */
  33. public interface ThemePropertyResolver {
  34. ThemeProperty resolve(String content) throws IOException;
  35. }
  36. @Service
  37. public class YamlThemePropertyResolver implements ThemePropertyResolver {
  38. private final ObjectMapper yamlMapper;
  39. public YamlThemePropertyResolver() {
  40. yamlMapper = new ObjectMapper(new YAMLFactory());
  41. //未知属性不报错
  42. yamlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  43. }
  44. @Override
  45. public ThemeProperty resolve(String content) throws IOException {
  46. return yamlMapper.readValue(content, ThemeProperty.class);
  47. }
  48. }
  49. @Data
  50. public class ThemeProperty {
  51. private String id;
  52. private String name;
  53. @Data
  54. public static class Author {
  55. private String name;
  56. private String website;
  57. }
  58. }
  59. id: ld
  60. name: ld
  61. author:
  62. name: ld
  63. website: https://

Halo(十)的更多相关文章

  1. Halo(十二)

    @RequestBody @ResponseBody @RequestBody 1) 该注解用于读取 Request 请求的 body 部分数据,使用系统默认配置的 HttpMessageConver ...

  2. NeHe OpenGL教程 第四十四课:3D光晕

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  3. SSE图像算法优化系列二十:一种快速简单而又有效的低照度图像恢复算法。

    又有很久没有动笔了,主要是最近没研究什么东西,而且现在主流的趋势都是研究深度学习去了,但自己没这方面的需求,同时也就很少有动力再去看传统算法,今天一个人在家,还是抽空分享一个简单的算法吧. 前段日子在 ...

  4. Halo 的缔造者们在忙什么?

    如果你自认为是一名主机游戏玩家,就一定知道 Halo.自 2001 年首代作品问世至今,十多年的磨炼已使得『光环』成为世界顶级的 FPS 游戏之一.<光环4>的推出,更让系列走向一个重要的 ...

  5. Windows系统下三十款优秀开源软件

    Windows系统下三十款优秀开源软件 1.Firefox 官方网站:http://www.getfirefox.com/ 可替换Internet Explorer 功能特点:如果你还没有使用Fire ...

  6. 前端开发中SEO的十二条总结

    一. 合理使用title, description, keywords二. 合理使用h1 - h6, h1标签的权重很高, 注意使用频率三. 列表代码使用ul, 重要文字使用strong标签四. 图片 ...

  7. 谈谈一些有趣的CSS题目(十二)-- 你该知道的字体 font-family

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  8. 如何一步一步用DDD设计一个电商网站(十)—— 一个完整的购物车

     阅读目录 前言 回顾 梳理 实现 结语 一.前言 之前的文章中已经涉及到了购买商品加入购物车,购物车内购物项的金额计算等功能.本篇准备把剩下的购物车的基本概念一次处理完. 二.回顾 在动手之前我对之 ...

  9. CSS十问——好奇心+刨根问底=CSSer

    最近有时间,想把酝酿的几篇博客都写出来,今天前端小学生带着10个问题,跟大家分享一下学习CSS的一些体会,我觉得想学好CSS,必须保持一颗好奇心和刨根问底的劲头,而不是复制粘贴,得过且过.本人能力有限 ...

随机推荐

  1. What is httpcontext

    https://docs.microsoft.com/en-us/dotnet/api/system.web.httpcontext?view=netframework-4.8 Encapsulate ...

  2. HDU6669 Game(思维,贪心)

    HDU6669 Game 维护区间 \([l,r]\) 为完成前 \(i\) 步使用最少步数后可能落在的区间. 初始时区间 \([l,r]\) 为整个坐标轴. 对于第 \(i\) 个任务区间 \([a ...

  3. mysql.connector.errors.ProgrammingError: 1698 (28000): Access denied for user 'root'@'localhost'

    排错,首先在sql编辑工具 通过测试连接,查看一下自己的密码是否正确 : 由此可见,是自己的密码错误,输入正确的密码后 在这里把密码修改为正确之后程序运行正常 #初始化数据库连接 engine = c ...

  4. pycharm项目代码上传远程centos服务器

    pycharm项目代码上传远程centos服务器 在工作中,我们经常会遇到如下情况,在windows系统下的pycharm中开发项目,但是需要在linux服务器上部署和运行我们的项目.那么我们的项目是 ...

  5. SqlServer 事物

    Ø 事务 在数据库中有时候需要把多个步骤的指令当作一个整体来运行,这个整体要么全部成功,要么全部失败,这就需要用到事务. 1. 事务的特点 事务有若干条T-SQL指令组成,并且所有的指令昨晚一个整体提 ...

  6. Ubuntu安装byzanz截取动态效果图

    byzanz-record主要参数选项 用法: byzanz-record [选项...] 录制您的当前桌面会话 帮助选项: -?, --help 显示帮助选项 --help-all 显示全部帮助选项 ...

  7. vs2010修改的内容在浏览器页面不变怎么办

    解决方法1: 如果是静态页面, Ctrl+F5 强制刷新浏览器页面 解决方法2: 页面中<%@ Page Language="C#" CodeBehind="Def ...

  8. GB/T2659-2000《世界各国和地区名称代码》

    代码 代码名称 004 阿富汗 008 阿尔巴尼亚 012 阿尔及利亚 016 美属萨摩亚 020 安道尔 024 安哥拉 660 安圭拉 010 南极洲 028 安提瓜和巴布达 032 阿根廷 05 ...

  9. Node.js实战3:加载一组模块。

    有时候,希望通过一个require来加载一个目录下的相关文件. 注:这个方法通常被用来作为组织web应用的架构技巧. 为达到这个目的,需要如此操作: 例:建立一个目录,在此目录中创建一个index.j ...

  10. python可变数据类型和不可变数据类型

    1.可变数据类型:在id不变的情况下,value可改变(列表和字典是可变类型,但是字典中的key值必须是不可变类型) 2.不可变数据类型:value改变,id也跟着改变.(数字,字符串,布尔类型,都是 ...