范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

顶呱呱啊!更便捷的Mybatis增强插件EasyMybatis

  easy-mybatis是一个对Mybatis的增强框架(插件)。在Spring集成Mybatis的基础上,将项目开发中对数据库的常用操作统一化。使用本框架可以很便捷的对数据库进行操作,提高开发效率,减少机械行为。
  项目主页:https://mybatis.zuoyu.top
  API文档地址:https://mybatis.zuoyu.top/doc/index.html
  GitHub地址:https://github.com/zuoyuip/easy-mybatis
  Gitee地址:https://gitee.com/zuoyuip/easy-mybatis
  Maven依赖引入        top.zuoyu.mybatis     easy-mybatis-spring-boot-starter     1.0.0 
  Gradle依赖引入  // https://mvnrepository.com/artifact/top.zuoyu.mybatis/easy-mybatis-spring-boot-starter implementation "top.zuoyu.mybatis:easy-mybatis-spring-boot-starter:1.0.0"  框架初衷
  这个框架的初衷是,减少Java程序员千篇一律的数据库操作。
  对于开发人员来说:精力应该花费在业务逻辑上,而非机械式的"技术"上。项目中减少无关痛痒的代码,从抽象的角度看实现。各司其职,各劳其力,追求项目角度的服务流水线。服务分离的时代
  如今已很难看到单体架构的项目(感兴趣的可以查看我对架构演变的描述《浅谈微服务》),目前的项目大都是通过RESTful  、MQ  、Socket  的方式(协议)进行数据传输。
  这让我开始质疑传统JavaWeb  项目中的数据库操作模式——即Model(DTO)  存在的意义。理论上,数据库设计是不可能完全遵循视图模型的,这就导致"正确"的做法是在项目中引入VO  ,由多个DTO  来组装。
  那么,为什么不能用灵活的Map来替代呢?
  对一个Map  的方法进行拓展,增加其对Json  的解析能力,那么是不是就可以摆脱POJO  的各种麻烦组装。思考框架设计
  我在思考如何设计这个框架的时候,被需要考虑的方方面面给阻挡住了。
  因为一个数据库框架需要考虑的东西实在太多了,比如:事务机制类型转换会话管理
  ···
  思来想去,发现自己方向跑偏了,我只是希望统一数据库操作的接口 + 摆脱Model,没必要重新平地起墙,完全可以在一个现有的框架基础上进行封装。
  那么,对这个现有框架的选择就尤为重要了。现有框架的选择
  目前Java中主流的数据库操作框架:Spring JDBCSpring Data JPAMybatisHibernate
  选择现有框架有一个原则——"统一数据库操作的接口 + 摆脱Model"是对该框架的加强,而非变异;不能因为"统一数据库操作的接口 + 摆脱Model"而无法使用原框架的部分功能。
  "摆脱Model"这个特点,首先就要排除重度ORM  框架,也就是支持JPA  操作的数据库——Spring Data JPA  、Hibernate  ;原因很简单,这两个框架的强大之处恰恰就在它完全面向Model  操作。
  剩下的就只有两个框架了,Spring JDBC  和Mybatis  。其中,Spring JDBC  留给了开发人员大量的可操作空间,更加自由,但恰恰是这种自由使得它更加繁琐。而Mybatis  是一个轻量ORM  框架,准确来说Mybatis  不能称为ORM  框架,因为它并不是面向Model  操作数据库,仅仅是将数据库字段与Model  字段互相赋值,并没有做到ORM  定义的关系映射。抉择
  由以上各框架的特点,结合国内Java语言中数据库操作框架的热度,毫无疑问的选择了Mybatis  。
  考虑到SpringBoot  对Mybatis  优秀的支持级别,我决定基于mybatis-spring-boot-starter  开发这款框架,准备来说应该称其为"插件"。框架特性更便捷
  摒弃传统mybatis  的model  、xml  、dao  数据库操作模式,避繁就简,快速开发。更高效
  采用预编译SQL  ,拒绝运行期间反射生成SQL  ,性能更高效。无侵入
  只是对Mybatis-Spring的增强插件,对已有工程不做任何修改,仍可使用原生框架的功能,仅仅是简化了开发阶段对数据库的操作。统一操作接口
  对数据库的所有操作共用一个接口,降低使用门槛,轻松操作数据库。统一操作对象
  使用JsonObject  为数据对象,提供一系列操作方法,方便从持久化对象组装为视图对象。易上手
  整个框架只提供了一个接口、一个注解、两个对象,仅仅一行配置便可完成对数据库进行常用操作。...安利在mybatis-spring-boot  环境下,使用该框架(插件),可以减少传统Mybatis  使用中对model  、xml  、dao  的机械式开发。所有的数据库操作均使用MapperRepository  接口,通过注解@Magic("xxx")  标记接口的数据表归属,即可直接使用。该框架(插件)不妨碍同时使用传统Mybatis  中model  、xml  、dao  的数据库开发方式。快速上手安装安装mybatis-spring-boot  环境
  mybatis-spring-boot的Maven依赖             org.springframework.boot         spring-boot-starter-parent         ${spring-boot.version}                                          org.mybatis.spring.boot             mybatis-spring-boot-starter             ${mybatis-spring-boot.version}              
  mybatis-spring-boot的Gradle依赖    plugins {     id "org.springframework.boot" version "${springBootVersion}"     id "io.spring.dependency-management" version "${springManagementVersion}"     id "java"     }      dependencies {     implementation "org.mybatis.spring.boot:mybatis-spring-boot-starter:${mybatisSpringVersion}"     } 安装本框架(插件)
  Maven依赖引入       top.zuoyu.mybatis     easy-mybatis-spring-boot-starter     1.0.0 
  Gradle依赖引入 // https://mvnrepository.com/artifact/top.zuoyu.mybatis/easy-mybatis-spring-boot-starter implementation "top.zuoyu.mybatis:easy-mybatis-spring-boot-starter:1.0.0"  配置
  这里以 MySQL  数据库为例,Oracle  数据库配置请参考配置说明配置spring-boot-jdbc  数据库 spring:   datasource:     type: com.zaxxer.hikari.HikariDataSource     driver-class-name: com.mysql.cj.jdbc.Driver     url: jdbc:mysql://172.0.0.1:3306/xxxx     username: xxxx     password: xxxx
  关于springBoot  的配置,这里不多赘述,更多移步springBoot官网。配置easy-mybatis  支持的表名(例子) easy-mybatis:   table-names: teacher, student
  这里的table-names  配置,表示需要easy-mybatis  框架支持的数据表名,多个表名使用逗号隔开。
  即可使用easy-mybatis  框架操作teacher  和student  两个数据表,如果需要支持其他数据表,需要在此配置。操作数据库(例子) @SpringBootTest class DemoApplicationTests {      // 表示该接口用来操作名称为"teacher"的数据表     @Magic("teacher")     private MapperRepository teacherRepository;      // 表示该接口用来操作名称为"student"的数据表     @Magic("student")     private MapperRepository studentRepository;       // 查询teacher表下所有数据     @Test     void teacherTest() {         teachertRepository.selectList().forEach(System.out::println);     }      // 查询student表下符合特定条件的数据     @Test     void studentTest() {         studentRepository.selectListByExample(           new JsonObject().put("birthday", "2009/12/12 12:12:12")           ).forEach(System.out::println);     }  }
  使用MapperRepository  接口对数据库进行操作,需要使用@Magic("表名称")  标记该接口的数据表归属。
  在本例中,@Magic("teacher")  表示该MapperRepository  为"teacher"  数据表的操作接口,可以通过teacherRepository  调用一系列方法完成对"teacher"  数据表的操作。配置说明
  该框架(插件)的全部相关配置 #easy-mybatis的相关配置 easy-mybatis:   #表示需要载入的数据库表   table-names: SYS_USER, SYS_DEPT   #默认的日期字符串格式   data-format: yyyy-MM-dd HH:mm:ss   #当数据库为Oracle时,数据表对应的主键SEQ名称   sequences:     SYS_USER: SEQ_SYS_USER,     SYS_DEPT: SEQ_SYS_DEPT   #当数据库为Oracle时,数据表的日期类型字段格式   oracle-date-format: yyyy-mm-dd hh24:mi:ss  详细说明table-names
  此配置表示需要载入的数据表,多个表名由逗号隔开,只有在此处配置了的数据表,才能在项目中使用@Magic("表名称")  标记MapperRepository  接口的数据表归属。data-format
  此配置表示在JsonObject  中的日期存在格式,JsonObject  中对日期的存储类型为String  类型,可通过此配置自定义存储格式,默认格式为yyyy-MM-dd HH:mm:ss  。
  注意
  当data-format  的格式修改,请务必将oracle-date-format  的格式与之匹配。sequences
  此配置表示当数据库为Oracle时,每个数据表的主键生成器名称,以键值对的格式进行参数配置。若此处没有对数据表的主键生成器进行配置,那么在做该数据表的数据插入行为时需自定义填充主键数值。oracle-date-format
  此配置表示当数据库为Oracle时,传入日期格式字段时的参数格式,即TO_DATE(field, "$dateFormat")  。
  注意
  当oracle-date-format  的格式修改,请务必将data-format  的格式与之匹配。操作接口约定
  本框架(插件)的数据库操作唯一接口—— top.zuoyu.mybatis.service.MapperRepository  。以ByExample  为结尾的方法
  此类是根据JsonObject  类型的参数example  中键值对,对符合要求的数据进行操作,例如:     // 构建example,这里指字段"birthday"为"2009/12/12 12:12:12"     JsonObject example = new JsonObject().put("birthday", "2009/12/12 12:12:12");     // 查询所有字段"birthday"为"2009/12/12 12:12:12"的学生数据     List studentList = studentRepository.selectListByExample(example);
  这里的selectListByExample  方法就是根据参数example  中键值对查找符合要求的数据。
  同理, countByExample  方法就是获取符合参数example  中键值对的数据总量...以By  为结尾的方法
  此类是根据String  类型的参数suffixSql  对方法追加参数中SQL语句的内容,例如:     // 查找"is_delete"字段为0的数据,并以年龄进行排序     List teachers = teacherRepository.selectListBy("WHERE is_delete = 0 ORDER BY age");      // 将"birthday"字段大于"1990/1/1 00:00:00"的数据,"salary"字段改为20000。 (也就是出生日期在1990年之前的老师,工资改为2W)     JsonObject example = new JsonObject().put("salary", 20000);     int count = teacherRepository.updateBy(example, "WHERE birthday < "1990/1/1 00:00:00"");
  这里的selectListBy  方法就是查找出符合参数中SQL语句要求的内容,updateBy  方法就是将符合参数中SQL语句要求的数据修改为example  定义的数值。
  同理,countBy  方法就是获取符合参数中SQL语句要求的数据总量...insert  、insertBatch  方法
  当数据库为MySQL时,如果数据表主键自增,则无需定义主键数值;若主键为非自增,则需定义主键数值。
  当数据库为Oracle时,如果在配置中定义了数据表的主键生成器,则无需定义主键数值;反之,则需定义主键数值。MapperRepository  提供了丰富的方法,以方便对数据库的CURD操作,更多关于MapperRepository  的使用说明请移步MapperRepository说明、MapperRepository的API文档。操作对象约定
  数据库接口的操作对象主要为 JsonObject  类型和JsonArray  类型。其中top.zuoyu.mybatis.json.JsonObject  为键值对容器,以键值的形式装载,数据结构为: {     "field1" : "value1",     "field2" : "value2",     "field3" : "value3",     ... }
  键的类型为java.lang.String  类型,值的类型可以为任何类型。
  JsonObject  提供了丰富的方法,以方便操作键值对和类型转换,更多关于JsonObject  的使用说明请移步JsonObject说明、JsonObject的API文档。其中top.zuoyu.mybatis.json.JsonArray  为数组容器,以多个单位的形式装载,数据结构为: [     object1,     object2,     object3,     ... ]
  每个单位可以为任何类型,且各单位类型允许与其他单位类型不同。
  JsonArray  提供了丰富的方法,以方便操作键值对和类型转换,更多关于JsonArray  的使用说明请移步JsonArray说明、JsonArray的API文档。
  具体方法可参考API文档。MapperRepository说明查询所有selectList    /**      * 查询所有      *      * @return 所有数据      */     List selectList(); 查询符合样例的数据selectListByExample    /**      * 根据已有键值查询      *      * @param example - 已有键值      * @return 符合要求的数据集合      */     List selectListByExample(JsonObject example); 根据主键查询唯一对象selectByPrimaryKey    /**      * 根据主键查询唯一对象      *      * @param primaryKey - 主键      * @return 唯一对象      */     JsonObject selectByPrimaryKey(Serializable primaryKey); 查询符合条件的数据selectListBy    /**      * 查询符合条件的数据      *      * @param suffixSql - 条件语句(例如:where field = xxx)      * @return 数据数量      */     List selectListBy(String suffixSql); 查询特定的字段或结果selectFields    /**      * 查询特定的字段或结果      * (例如:"fieldA, fieldB, fieldC")      * (例如:"COUNT(field)")      *      * @param fields - 特定的字段或结果      * @return 特定的字段或结果      */     JsonArray selectFields(String fields); 根据样例查询特定的字段或结果selectFieldsByExample    /**      * 根据已有键值查询特定的字段或结果      * (例如:"fieldA, fieldB, fieldC")      * (例如:"COUNT(field)")      *      * @param fields  - 特定的字段或结果      * @param example - 已有键值      * @return 特定的字段或结果      */     JsonArray selectFieldsByExample(String fields, JsonObject example); 根据主键查询特定的字段或结果selectFieldsByPrimaryKey    /**      * 根据主键查询特定的字段或结果      *      * @param fields     - 特定的字段或结果(例如:"fieldA, fieldB, fieldC")      * @param primaryKey - 主键      * @return 特定的字段或结果      */     JsonArray selectFieldsByPrimaryKey(String fields, Serializable primaryKey); 根据主键集合查询特定的字段或结果selectFieldsByPrimaryKeys    /**      * 根据主键集合查询特定的字段或结果      *      * @param fields      - 特定的字段或结果(例如:"fieldA, fieldB, fieldC")      * @param primaryKeys - 主键集合      * @return 特定的字段或结果      */     JsonArray selectFieldsByPrimaryKeys(String fields, Serializable[] primaryKeys); 查询符合条件的数据selectFieldsBy    /**      * 查询符合条件的数据      *      * @param fields    - 特定的字段或结果(例如:"fieldA, fieldB, fieldC")      * @param suffixSql - 条件语句(例如:where field = xxx)      * @return 特定的字段或结果      */     JsonArray selectFieldsBy(String fields, String suffixSql); 查询符合条件的数据数量countBy    /**      * 查询符合条件的数据数量      *      * @param suffixSql - 条件语句(例如:where field = xxx)      * @return 数据数量      */     long countBy(String suffixSql); 查询是否存在符合样例的数据数量countByExample    /**      * 根据已有键值查询是否存在符合条件的数据数量      *      * @param example - 已有键值      * @return 数据数量      */     long countByExample(JsonObject example); 是否存在符合条件的数据existsBy    /**      * 是否存在符合条件的数据      *      * @param suffixSql - 条件语句(例如:where field = xxx)      * @return 是否存在      */     boolean existsBy(String suffixSql); 是否存在符合样例的数据existsByExample    /**      * 根据已有键值查询是否存在符合条件的数据      *      * @param example - 已有键值      * @return 是否存在      */     boolean existsByExample(JsonObject example); 新增对象insert    /**      * 新增对象      *      * @param jsonObject - 对象键值      * @return 变动数据的数量      */     int insert(JsonObject jsonObject); 批量新增对象insertBatch    /**      * 批量新增对象      *      * @param jsonObjects - 对象键值集合      * @return 变动数据的数量      */     int insertBatch(List jsonObjects); 根据主键修改对象属性updateByPrimaryKey    /**      * 根据主键修改对象属性      *      * @param jsonObject - 包含主键对象键值      * @return 变动数据的数量      */     int updateByPrimaryKey(JsonObject jsonObject); 修改特定条件的对象属性updateBy    /**      * 修改特定条件的对象属性      *      * @param jsonObject - 要修改的键值      * @param suffixSql  - 条件语句(例如:where field = xxx)      * @return 变动数据的数量      */     int updateBy(JsonObject jsonObject, String suffixSql); 批量根据主键修改对象属性updateByPrimaryKeyBatch    /**      * 批量根据主键修改对象属性      *      * @param jsonObjects - 对象键值集合      * @return 变动数据的数量      */     int updateByPrimaryKeyBatch(List jsonObjects); 根据主键删除对象deleteByPrimaryKey    /**      * 根据主键删除对象      *      * @param primaryKey - 主键      * @return 变动数据的数量      */     int deleteByPrimaryKey(Serializable primaryKey); 删除符合条件的数据deleteBy    /**      * 删除符合条件的数据      *      * @param suffixSql - 条件语句(例如:where field = xxx)      * @return 变动数据的数量      */     int deleteBy(String suffixSql); 批量根据主键删除对象deleteByPrimaryKeys    /**      * 批量根据主键删除对象      *      * @param primaryKeys - 主键组      * @return 变动数据的数量      */     int deleteByPrimaryKeys(Serializable[] primaryKeys); 根据样例删除对象deleteByExample    /**      * 根据已有键值删除对象      *      * @param example - 已有键值      * @return 变动数据的数量      */     int deleteByExample(JsonObject example); JsonObject说明
  top.zuoyu.mybatis.json.JsonObject  为键值对容器,以键值的形式装载,数据结构为:{     "field1" : "value1",     "field2" : "value2",     "field3" : "value3",     ... }
  键的类型为java.lang.String  类型,值的类型可以为任何类型。类型转换
  内部默认已包含常规的类型转换,默认支持以下类型:java.math.BigInteger  java.math.BigDecimal  java.lang.Boolean  java.lang.Byte  java.lang.Character  java.util.Date  java.lang.Double  java.lang.Float  java.lang.Integer  java.lang.Long  java.lang.Short  java.lang.String
  如果默认的转换器无法满足需求,或者需要转换为其他类型,可通过自定义转换器ConvertClass  进行实现,接口方法:public interface ConvertClass {      /**      * 将给定的 value 对象转换为 T 类型      *      * @param value - 给定对象      * @return 目标转换类型的对象      */     T convert(Object value);      /**      * 将给定的 value 对象转换为 T 类型, 否则返回  defaultValue      *      * @param value        - 给定对象      * @param defaultValue - 默认值      * @return 目标转换类型的对象      */     T convert(Object value, T defaultValue); } 示例    @Test     void convertTest() {         // 使用JSON字符串初始化对象         JsonObject student = new JsonObject(studentJSON);          // 获取学生的性别,如果无法转换则返回"未知"         String sex = student.getValue("sex", new SexConvert());          // 获取学生的性别,如果无法转换则返回"未录入"         String sexOrDefault = student.getValue("sex", new SexConvert(), "未录入");     }      static class SexConvert implements ConvertClass {          @Override         public String convert(Object value) {             if (value instanceof Integer) {                 if ((Integer) value == 1) {                     return "男";                 } else if ((Integer)value == 0) {                     return "女";                 }             }             return "未知";         }          @Override         public String convert(Object value, String defaultValue) {             if (value instanceof Integer) {                 if ((Integer) value == 1) {                     return "男";                 } else if ((Integer)value == 0) {                     return "女";                 }             }             return defaultValue;         }     }
  本示例也可使用StringConvert  转换器,StringConvert  为ConvertClass  的子接口。
  也可以通过toClass  方法,将JsonObject  对象转换为指定类型的实体类。子接口:BigDecimalConvert  BigIntegerConvert  BooleanConvert  ByteConvert  CharacterConvert  DateConvert  DoubleConvert  FloatConvert  IntegerConvert  LongConvert  ShortConvert  StringConvert
  更多方法请移步JsonObject的API文档。JsonArray说明
  top.zuoyu.mybatis.json.JsonArray  为数组容器,以多个单位的形式装载,数据结构为: [     object1,     object2,     object3,     ... ]
  每个单位可以为任何类型,且各单位类型允许与其他单位类型不同。类型转换
  具体使用方法与JsonObject  在类型转换操作一致,参考JsonObject的类型转换操作
  原文链接: https://www.cnblogs.com/1214804270hacker/p/15765776.html

美国政府宣布17个州和华盛顿特区进入紧急状态,为什么?屋漏偏逢连阴雨!美国疫情肆虐席卷全美不堪重负,这不又遭网络攻击,美国政府宣布17个州和华盛顿特区进入紧急状态,原因是当地最大燃油管道运营商遭到网络攻击,被迫关闭美国东部沿海各州的主为什么别的手机都能接收wifi,而红米手机却收不到?不知道啊,我的红米也是这样,其他手机信号很好的地方,我的红米note9就收不到,勉强收到还断流,不知道怎么回事。感谢您的阅读!如果我们的手机接收不到WiFi,我们要考虑以下几种原因4月性价比手机出炉,竞争太激烈,小米Redmi被比下去了要说到性价比手机,小伙伴肯定会想到小米及其子品牌Redmi,不过随着Redmi在性价比方面的不断获利,很多品牌也开始在手机性价比方面发力,可以说目前的性价比手机竞争也是越来越强烈了回看比尔盖茨27年的婚姻,富人与穷人一样经受着感情的亲疏世界首富离婚,这可不是个小事。经过对我们关系的深思熟虑和努力挽救后,我们决定结束婚姻生活。在过去27年,我们养育了三个优秀的孩子,并建立了一个基金会,使所有人能过上健康富有成效的生女性的数据也顶半边天关于性别平等问题的已有讨论多集中在文化符号领域和线下社会,关注女性社会性别表征的物化刻板化与污名化,女性在就业市场和婚姻家庭中遭受歧视和不公正对待等。随着智能技术社会的到来,有研究SHIB更像是一个以太坊时代DeFi时代的新狗狗币由Decrypt举办的2021以太坊虚拟峰会上,许多嘉宾进行了精彩的发言,其中包括DanielRobertsV神czSergeyNazarovStaniKulechovJoeLub大公司早报美团调整配送抽佣抖音不服直播王者荣耀赔偿腾讯800万(整理胡毓靖)今天是5月11日星期二,过去24小时值得关注的大公司动态包括美团调整配送抽佣抖音回应直播王者荣耀被判赔腾讯800万腾讯云发布多款存储新品长安汽车称与华为宁德时代打造的芯片领域国产自主化实力增强,我们离高端制程光刻机还有多远?自从我们的高端芯片遭遇卡脖子之后。让更多的人认识到了国产自主可控的重要性,也让大多数人认识到没有光刻机将一事无成!难道高端工艺制程光刻机真的离我们很远吗?众所周知,芯片的制造环节主不用充电的电动车?日产ePOWER开辟新赛道在刚过去的上海国际车展中,相信大家都被各种纯电新车刷屏了,车展上亮相的新车不仅颜值高,在纯电续航和自动驾驶硬件上也有质的提升。不过正是由于新车的信息太多,很容易让其它信息淹没其中,腾讯手机管家等84款App违法违规收集使用个人信息中国青年网北京5月10日电据网信中国微信公众号消息,近期,针对人民群众反映强烈的App非法获取超范围收集过度索权等侵害个人信息的现象,国家互联网信息办公室依据中华人民共和国网络安全陶琳再发声引发网友质疑消费者需要教育?中新经纬客户端5月11日电10日,昔日不妥协的特斯拉全球副总裁陶琳再度发声,称需加强消费者教育,引发网友质疑。有网友表示原来是这届消费者不行。还有网友指出,买你的东西还要被你教育。
荣耀V30和荣耀V30Pro有什么区别?荣耀V30和荣耀V30Pro有什么区别?下面我们就简单说说性能部分,荣耀V30采用麒麟990处理器,荣耀V30Pro采用麒麟9905G处理器,麒麟9905G的规格高一些,因此性能稍一大波品牌新机即将发布!来看看有你们喜欢的吗?现在手机的更新换代越来越快。在这个辞旧迎新的月份里,国内品牌手机也迎来了他们的新机发布,第一位荣耀60,官方发布的时间是12月1号。荣耀60全系配备的是高通骁龙870处理器,这是一赛微电子(300456。SZ)瑞典子公司拟8450万欧元收购德国产线资产格隆汇12月14日丨赛微电子(300456。SZ)公布,为将公司核心主业传感器和芯片工艺制造的业务范围进一步拓宽至汽车电子领域迅速提升可兼容MEMS与CMOS芯片集成工艺制造的境外人人都要懂得网站爬虫知识,你知道多少呢?什么是爬虫呢?网络爬虫是一种按照一定的规则,自动地抓取互联网信息的程序或者脚本。2可以理解为一个自动访问网页并进行相关操作的小机器人。本质上就是实现高效自动地进行网络信息的读取收集数据要素应更好服务和融入新发展格局新一轮科技革命和产业变革方兴未艾,各种新技术日益融入经济社会发展各领域全过程,数字经济发展速度之快辐射范围之广影响程度之深前所未有。多年来,我们顺应数字经济发展趋势,积极推动互联网CSS的未来CascadeLayers(CSSlayer)最近在Weekly邮件推送中查阅到这样的一条信息Chromium团队宣布他们将随Chromium99(预计在明年3月发布)一起发布CSSCascadeLayers会发现这条信息里面基于docker部署prometheusgrafana部署环境rootroutecatetcredhatreleaseCentOSLinuxrelease7。6。1810(Core)安装dockersudoyuminstallyyum消息称苹果5G新手机iPhoneSE3近期试生产搭载A15残血版12月20日消息,据供应链爆料,苹果即将在近期对iPhoneSE3进行试产。新款iPhoneSE3配备了4。7英寸的RetinaHDLCD显示屏和配有实体指纹Home按键,背面仍旧3点弄清楚格力美的海尔空调的质量哪家好,5个选择技巧要掌握大家好,我是专注家居和装修知识分享的家居杂坛。喜欢的话就点击一下关注吧!国产空调最近几年发展是越来越好,无论是其质量还是其服务,都得到了更多的朋友的认可。目前市场上比较常见的国产空深度解读!高调进军半导体工业富联有哪些芯机会?火出圈的半导体产业又迎来一匹黑马,头顶智能制造与工业互联网巨头光环的工业富联正式宣布入场,成为了行业难以忽视的新势力。12月13日晚间,工业富联公告称,出资22。2亿元,牵手投资机收入与成本端持续改善,三大电信运营商估值迎修复智通财经APP获悉,东方财富证券发布电信运营商行业研究报告称,看好当前时点下国内运营商行业的投资机会,建议关注三大运营商中国移动(00941)中国电信(00728)和中国联通(00