第四阶段02-酷鲨商城项目Mybatis相关的配置

news2024/11/17 3:50:34

14. 添加与Mybatis相关的配置

在每个项目中,当需要使用Mybatis实现数据库编程时,都需要添加2项一次性配置:配置Mapper接口所在的包(package)、配置XML文件在哪里。

关于配置Mapper接口所在的包,可以(以下做法二选一即可):

  • 【推荐】在配置类上使用@MapperScan注解,并指定注解的参数,此参数值就是包名
  • 在每个Mapper接口上添加@Mapper注解

则在项目的根包下创建config.MybatisConfiguration类,在此类上添加@Configuration注解,则可以将此类标记为“配置类”,然后,再添加@MapperScan注解来指定Mapper接口所在的包:

package cn.tedu.csmall.product.config;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@MapperScan("cn.tedu.csmall.product.mapper")
public class MybatisConfiguration {
}

**提示:**目前还没有创建任何Mapper接口,甚至,用于存放Mapper接口的mapper子包都是不存在,但这并不影响以上配置!后续在创建Mapper接口时,保证创建的接口都在以上配置值对应的包中即可!

另外,关于“配置XML文件在哪里”,需要通过配置文件(application.properties / application.yml / 相关Profile文件)中的mybatis.mapper-locations进行配置。由于此项配置的值,不会因为切换开发环境、测试环境等环境而变化,也不会因为使用不同的电脑来开发而变化,所以,应该将其配置在主配置文件中!

先在src/main/resources下创建mapper文件夹,此文件夹将用于存放配置SQL语句的XML文件。

application.yml中添加配置:

mybatis:
  mapper-locations: classpath:mapper/*.xml

15. 使用Mybatis访问数据

15.1. Mybatis的基本使用步骤

首先,需要创建接口,通常每张数据表都有一个对应的Mapper接口,并在接口中声明抽象方法。

关于抽象方法的声明:

  • 返回值类型:如果要执行的数据访问操作是增、删、改类型的,始终使用int作为返回值类型,表示“受影响的行数”,如果不关心“受影响的行数”,也可以使用void作为返回值类型,但并不推荐;如果要执行数据访问操作是查询类型的,只需要保证返回值类型能够“放得下”查询结果即可。

    • 提示:非统计类型的查询,一般不建议使用实体类作为返回值类型,应该使用其它POJO类型,《阿里巴巴Java开发手册》提供的参考

      1) 数据对象:xxxDO,xxx 即为数据表名。
      2) 数据传输对象:xxxDTO,xxx 为业务领域相关的名称。
      3) 展示对象:xxxVO,xxx 一般为网页名称。
      4) POJO 是 DO/DTO/BO/VO 的统称,禁止命名成 xxxPOJO。
      

      另外,关于POJO的后缀,必须每个字母都是大写的,《阿里巴巴Java开发手册》提供的强制规定:

      【强制】类名使用 UpperCamelCase 风格,必须遵从驼峰形式,但以下情形例外:DO / BO /
      DTO / VO / AO
      正例:MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion
      反例:macroPolo / UserDo / XMLService / TCPUDPDeal / TAPromotion
      
    • 通常,每张数据表都至少有2个VO类(或使用其它后缀),分别用于表示查询详情、查询列表项的结果类型

  • 方法名称:自定义,建议不要重载,《阿里巴巴Java开发手册》提供的参考

    1) 获取单个对象的方法用 get 做前缀。
    2) 获取多个对象的方法用 list 做前缀。
    3) 获取统计值的方法用 count 做前缀。
    4) 插入的方法用 save/insert 做前缀。
    5) 删除的方法用 remove/delete 做前缀。
    6) 修改的方法用 update 做前缀。
    
  • 参数列表:取决于要执行的SQL语句中有哪些参数,如果参数的数量超过1个,且具有明确的相关性,建议使用封装的类型作为抽象方法的参数

    • 通常,插入单条数据、修改单条数据时,使用实体类作为抽象方法的参数
    • 如果涉及批量数据操作,例如批量删除、批量更新、批量插入等,可以使用数组、可变参数或List集合表示若干个参数值

然后,需要准备好XML文件,在XML文件中配置抽象方法映射的SQL语句。

关于XML文件,应该是从此前的项目中复制过来再修改,因为此文件需要固定的头部声明,即:
请添加图片描述

关于此类文件,可以从 http://doc.canglaoshi.org/config/Mapper.xml.zip 下载,或在网上搜索相关文章,或在Mybatis官网上找到示例代码,都可以得到以上固定的代码片段。

关于此XML文件的内部:

  • 根标签必须是<mapper>,且此标签必须配置namespace属性,取值为对应的接口的全限定名(包名加类名)

  • 在根标签的子级,可以使用<insert> / <delete> / <update> / <select>这些标签来配置增、删、改、查对应的SQL语句,这些标签都必须配置id属性,取值为对应的抽象方法的名称

    • 其实,<update><delete>这2个标签可以随意调换使用,例如,配置DELETE语句可以使用<update>标签,甚至,在不考虑获取自动编号的ID时,<insert>标签和<update><delete>也可以随意调用使用,因为这3种数据访问操作在JDBC的底层实现是一样的,当然,这种乱用的方式肯定是非常不建议的
  • <insert>这4种标签的子级,编写SQL语句,参数部分使用#{名称}格式的占位符来表示,其中,占位符中的“名称”应该是参数名称,或封装类型中的属性名

  • 严格说来,在#{}格式的占位符中的名称,将被用于生成Setter & Getter的名称,然后,Mybatis框架会自动调用相关方法

  • 如果配置的是<insert>标签,并且,插入数据的表的主键是自动编号的,应该在此标签上配置useGeneratedKeys="true"keyProperty="主键属性"这2个属性,以获取自动编号的ID值

  • 如果涉及批量操作,需要通过<foreach>标签来遍历参数对象,关于此标签的使用:

    • collection属性:表示被遍历的对象,当抽象方法的参数只有1个,且没有添加@Param注解时,如果参数是数组或可变参数,则此属性的值为array,如果参数是List集合,则此属性的值为list;当抽象方法的参数超过1个,需要添加@Param注解,则此属性的值为注解的配置值
    • item属性:表示遍历过程中各元素的名称,是自定义名称,并且,在<foreach>子级的#{}占位符中,也使用此名称表示被遍历到的元素
    • separator属性:表示遍历过程中各值之间的分隔符号
    • <foreach>标签是Mybatis的“动态SQL”标签之一
  • 关于动态SQL的<if>标签,可以对参数进行判断,从而确定SQL语句中应该包含或不包含哪些片段

    • 需要注意,没有所谓的else标签,如果一定要实现类似Java中if...else...的效果,可以使用2个条件完全相反的<if>标签(虽然执行效率会差一些),或者,使用<choose>系列标签,语法格式如下:

      <choose>
      	<when test="条件">
          	满足条件时的SQL片段
          </when>
          <otherwise>
          	不满足条件时的SQL片段
          </otherwise>
      </choose>
      
  • 如果涉及修改数据的操作,当使用了<if>实现动态SQL时,通常,应该使用<set>标签将更新列表框住,并且,SQL语句中不需要写SET关键字

  • 如果配置的是<select>标签,此标签必须配置resultTyperesultMap这2个属性中的某1个

    • resultType的值是基本数据类型时,直接使用类型名称作为此属性值即可,例如resultType="int"
    • resultType的值是引用数据类型时,需要使用类型的全限定名作为此属性值,例如resultType="cn.tedu.xxx.User",但是,如果类型是java.lang包下的,则可以不写包名,例如resultType="Integer"
  • 在编写查询的SQL语句时,可以使用<sql>标签封装查询的字段列表,并使用<include>标签来引用封装的查询字段列表

    • 由于IntelliJ IDEA会检查每个标签的子级内容的语法,所以,在<sql>标签下直接写字段列表,IntelliJ IDEA会提示错误,但是并不影响运行,可以使用<if test="true">将字段列表框住,以“欺骗”IntelliJ IDEA使之不报错
    • 通常,在<include>标签的子级并不编写任何代码,所以,此标签推荐使用单标签格式
  • 建议为所有的“非统计查询”配置<resultMap>

15.2. 关于SQL语句的编写规范

关于INSERT语句:

  • 使用INSERT INTO开头,不要省略INTO关键字
  • 使用VALUES,不要使用VALUE
  • 显式写出字段列表,不要省略字段列表

关于SELECT语句:

  • 统计查询时,count()函数内必须使用星号

  • 不允许使用星号(*)表示被查询的字段列表

  • 查询列表时,必须显式的使用ORDER BY指定排序规则,如果没有使用ORDER BY,则排序结果是不可控的,并且,在使用ORDER BY指定排序规则时,如果第1排序规则无法明确的区分所有数据的顺序,还应该指定第2排序规则,甚至第3排序规则等,直至所有数据都有明确的排序规则
    请添加图片描述

15.3. 关于编写SQL语句时的代码提示

首先,需要在IntelliJ IDEA中,为当前项目配置Database面板,且Database面板中仅有当前使用的这1个数据库。

然后,需要在设置中,指定SQL方言(Dialect),即:
请添加图片描述

**提示:**如果完成以上配置,在XML文件中编写SQL语句仍没有提示,可以尝试删除并重新配置Database面板,或将方言在MariaDB和MySQL之间切换。

15.4. 使用测试检验开发的数据访问功能

在Spring Boot项目中,所有的测试类都应该创建在src/test/java下的根包(创建项目时就存在的包,与src/main/java下的根包是相同的)下。

在Spring Boot项目中,当需要执行的测试是基于加载整个项目环境的(例如需要读取配置文件、需要使用@Autowired自动装配等),测试类必须添加@SpringBootTest注解。

**注意:**由于src/test/java下的根包与src/main/java下的根包是相同的,所以,任何测试类都不要和被测试类的名称相同,一般,测试类的名称建议添加Tests作为最后一个单词,例如AlbumMapperTests

例如,在src/test/java下的根包下创建mapper.AlbumMapperTests类,在类上添加@SpringBootTest注解,然后,在类中对AlbumMapper接口中定义的功能进行测试:

package cn.tedu.csmall.product.mapper;

import cn.tedu.csmall.product.pojo.entity.Album;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class AlbumMapperTests {

    @Autowired
    AlbumMapper mapper;

    @Test
    void insert() {
        Album album = new Album();
        album.setName("测试名称001");
        album.setDescription("测试简介001");
        album.setSort(100); // 注意:由于MySQL中表设计的限制,此值只能是[0,255]区间内的

        int rows = mapper.insert(album);
        System.out.println("插入数据完成,受影响的行数:" + rows);
    }

}

15.5. 使用Mybatis的常见错误

如果Mapper接口不在@MapperScan指定的包下,或根本没有配置@MapperScan,总之,Mybatis找不到Mapper接口时,会出现错误:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'cn.tedu.csmall.product.mapper.AlbumMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

如果存在以下问题:

  • 在XML文件中<mapper>标签的namespace值有误
  • 在XML文件中<insert>这类标签的id值有误
  • 在配置文件中mybatis.mapper-locations属性的值有误

总之,当Mybatis找不到抽象方法映射的SQL语句时,会出现错误:

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.tedu.csmall.product.mapper.AlbumMapper.insert

如果配置SQL语句时,在#{}格式的占位符中,名称写错时,会出现错误:

Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'nama' in 'class cn.tedu.csmall.product.pojo.entity.Album'

如果配置<select>标签时,既没有配置resultType又没有配置resultMap,会出现错误:

Caused by: org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the Mapped Statement 'cn.tedu.csmall.product.mapper.AlbumMapper.count'.  It's likely that neither a Result Type nor a Result Map was specified.

如果配置<select>标签时,使用resultType,但值却是某个<resultMap>的id,或是错误的全限定名,会出现错误:

Caused by: java.lang.ClassNotFoundException: Cannot find class: StandardResultMap

如果配置<select>标签时,使用resultMap,但值却是某个类名,或是其它错误值,只要不是某个<resultMap>的id值,会出现错误:

java.lang.IllegalArgumentException: Result Maps collection does not contain value for cn.tedu.csmall.product.pojo.vo.AlbumStandardVO

如果某个抽象方法对应的SQL语句的配置存在多个(通常可能是因为复制粘贴代码,但没有修改对应关系导致的,例如忘记修改新的XML文件中的namespace值等),会出现错误(这个错误,不仅仅只看最后一个Caused by,偏上的Caused by也有参考价值,会告诉你是哪些文件中出现了对应同一个抽象方法的配置):

Caused by: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. The XML location is 'file [D:\IdeaProjects\jsd2209-csmall-product-teacher\target\classes\mapper\BrandMapper.xml]'. Cause: java.lang.IllegalArgumentException: Result Maps collection already contains value for cn.tedu.csmall.product.mapper.AlbumMapper.StandardResultMap

Caused by: java.lang.IllegalArgumentException: Result Maps collection already contains value for cn.tedu.csmall.product.mapper.AlbumMapper.StandardResultMap

16. 关于SLF4j日志

在开发实践中,通常是禁止使用System.out.println()这种语句输出信息的,主要原因有:

  • 不易控:在开发过程中,可能会通过这样的语句输出某些变量值,或输出程序的执行过程,这些输出的内容可能仅适用于开发过程中,当项目实际部署上线,就不再应该甚至不允许输出这些内容,因为输出的变量值可能是敏感信息,或程序的执行过程不应该被暴露出来
  • 执行效率低下

在Spring Boot项目中,基础依赖项(spring-boot-starter)中已经包含了日志相关的依赖项,可以直接使用日志框架来输出信息!

在添加了Lombok后,在任何类的声明之前,添加@Slf4j注解,则编译期会自动声明一个名为log的变量,所以,可以在类中通过此变量来输出日志。

如果没有使用Lombok,可以自行声明日志变量,例如:

private static Logger logger = LoggerFactory.getLogger(Slf4jTests.class);

在日志框架中,根据日志信息的重要程度,从不太重要,到非常重要,划分了几个等级,依次是:

  • trace:跟踪信息
  • debug:调试信息
  • info:一般信息
  • warn:警告信息
  • error:错误信息

在调用log变量的方法来输出日志时,有以上5个级别对应的方法,调用不同的方法,就会输出不同级别的日志。

在没有加载Spring Boot的情况下,日志的默认显示级别是debug,只会显示此级别及更加重要的级别的日志,如果加载了Spring Boot(例如在测试类上添加了@SpringBootTest注解),日志的默认显示级别是info,则只会显示infowarnerror级别的日志,不会显示tracedebug级别的日志。

在Spring Boot项目中,可以在配置文件(application.properties / application.yml / 相关Profile配置)中配置logging.level.包名属性,以指定某个包下的所有类的默认日志显示级别,此属性的值为5个级别中的某1个。

例如,在application-dev.yml添加配置(另外,你可以在其它Profile配置中为日志的显示级别配置不同的值):

logging:
  level:
    cn.tedu.csmall: trace

**提示:**当配置包名时,不必把包名配置得特别具体,可以作用于其子孙包下所有的类,但是,必须至少配置1级包名,例如配置到cn这一级包,不可以完全不配置包名,需要注意,当前项目中添加的所有依赖项,也是当前项目的一部分,不应该将包名配置得过于简单,例如只使用cn作为配置的包名。

**提示:**Mybatis框架会生成各Mapper接口的对象,这些对象在执行SQL语句时,也会输出日志,是traceinfo级别的日志,当把日志的显示级别设置为较低的级别时,可以看到这些日志。

在调用日志的方法时,如果输出的信息中包含变量值,推荐使用trace(String message, Object... args)方法(其它级别也是同样参数列表的方法),在String message参数中,可以使用{}作为占位符,表示此处是一个变量值,然后,通过Object... args依次传入各占位符对应的值,例如:

int x = 1;
int y = 2;
System.out.println("x = " + x + ", y = " + y + ", x + y = " + (x + y)); // 传统做法
log.info("x = {}, y = {}, x + y = {}", x , y , x + y); // 使用日志输出变量的做法

以上使用日志输出时,不会涉及到字符串的拼接,所以,执行效率会更高,并且,以上方法的第1个参数是字符串常量,是在内存中的字符串常量池中的,也可以一定程度上提高执行效率。

另外,SLF4j其实是一种日志框架的标准,并没有具体实现日志的输出功能,通常,是使用log4jlogback这些日志框架来实现具体功能的!请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/375940.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BPMN2.0是什么,BPMN能解决企业流程管理中哪些问题?

一、前言&#xff1a; 在任何行业和企业中&#xff0c;一定存在着各式各样的流程&#xff0c;请假流程、报销流程、入职流程、离职流程、出差流程、合同审批流程、出入库流程等等…… 无论是管理者、技术人员还是业务人员&#xff0c;每天肯定也在使用各种流程&#xff0c;但…

《MySQL学习》 索引失效的三种特殊情况

一.条件字段使用函数 explain select * from bpm_proc_instance bpi where CREATED_AT > 2022-06-01 CREATED_AT 字段建立了索引&#xff0c;此时explain分析的结果表明能使用到索引 但如果我们对 CREATED_AT 字段使用函数 explain select * from bpm_proc_instance bpi w…

【强烈建议收藏:计算机网络面试专题:URL地址栏中输入网址到页面展示的全过程DNS域名解析的过程】

一.面试官:我们就来问一下关于计算机网络相关的专业知识吧 面试官:好的&#xff0c;那我们yyyy-mm-dd就在腾讯会议上面试吧; 卑微的你:好的。 卑微的你:到了面试的时间了&#xff0c;守时的你一定早早的进入了视频会议&#xff0c;等待着面试官&#xff0c;心里慌的一批&#…

Elasticsearch7.8.0版本进阶——文档处理

目录一、文档冲突1.1、文档冲突的概述1.2、在数据库领域中如何确保并发更新时变更不会丢失1.2.1、悲观并发控制1.2.2、乐观并发控制二、乐观并发控制2.1、Elasticsearch 的概述2.2、Elasticsearch 如何确保文档的旧版本不会覆盖新的版本2.3、Elasticsearch 如何解决相互冲突的变…

洛谷P5738 【深基7.例4】歌唱比赛 C语言/C++

【深基7.例4】歌唱比赛 题目描述 n(n≤100)n(n\le 100)n(n≤100) 名同学参加歌唱比赛&#xff0c;并接受 m(m≤20)m(m\le 20)m(m≤20) 名评委的评分&#xff0c;评分范围是 000 到 101010 分。这名同学的得分就是这些评委给分中去掉一个最高分&#xff0c;去掉一个最低分&…

拍摄的风景视频中,如何快速有效地去除视频中的杂物?

我们在外游玩拍摄的短视频&#xff0c;视频中出现的不必要杂物&#xff0c;比如垃圾、广告或其他不相关的人&#xff0c;会影响视频内容的传达&#xff0c;会降低视频的观感质量。因此&#xff0c;需要去除这些杂物&#xff0c;使得视频更加干净、整洁。让观众更容易理解视频的…

性能分析工具的使用

在数据库调优中&#xff0c;我们的目标就是响应时间更快&#xff0c;吞吐量更大。利用宏观的监控工具和微观的日志分析可以帮我们快速找到调优的思路和方式。 1.数据库服务器优化步骤 数据库调优流程图 整个流程划分成了**观察(Show status&#xff09;和行动&#xff08;Ac…

行测-判断推理-图形推理-样式规律-属性规律-曲直性

左边的图全是由曲线构成的选C1 3 5全是由曲线构成的2 4 6全是由直线构成的第三行的图形有曲有直选A1 3 5有曲有直2 4 6全是直线选D图形有曲有直&#xff0c;排除B D外曲内直->内曲外直->外曲内直->内曲外直->外曲内直->内曲外直所以问号出的图形应该是内曲外直选…

【面试题】当面试官问 Vue2与Vue3的区别,你该怎么回答?

大厂面试题分享 面试题库后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#xff1a;前端面试题库被问到 《vue2 与 vue3 的区别》应该怎么回答Vue 内部根据功能可以被分为三个大的模块&#xff1a;响应性 reactivite、运行时 runtime、编辑器…

Win11 文件夹打开慢或卡顿解决方案

问题 目前是 2023/2/27, 我的 Win11 系统点开一个文件夹要等待 2-3 秒才能加载出来, 使用体验极差。网上查阅大量资料, 有些人在系统更新后这个情况就消失了, 但是我这一直存在, 系统也是当前的最新版, 没有修复。 目前得出的结论是, 因为 Win11 的工具栏占用了过多的资源, 需…

Web3中文|Litra:简洁而优美的NFT流动性协议,能给NFT市场带来什么?

2021年&#xff0c;NFT元年2021年&#xff0c;无疑是 NFT 的“元年”。这一年推特创始人的首条推特被拍出250万美元&#xff0c;加密艺术家Beeple的数字作品“First 5000 Days”在佳士得以6900万美元价格成交&#xff0c;无聊猿最高上涨了1800倍。2021年11月&#xff0c;在Goog…

【Python学习笔记】第十九节 Python 面向对象(一)

在现实世界中&#xff0c;随处可见的一种事物就是对象&#xff0c;对象是事物存在的实体&#xff0c;如学生、汽车等。人类解决问题的方式总是将复杂的事物简单化&#xff0c;于是就会思考这些对象都是由哪些部分组成的。通常都会将对象划分为两个部分&#xff0c;即静态部分与…

一文让你上手shell

简介shell是C 语言编写的程序&#xff0c;是向操作访问Linux内核的桥梁。shell也是测试人员需要简单必备的一项小技能&#xff0c;至少能看懂并简单编写脚本&#xff0c;可以让与Linux相关的操作提升1个level。扩展名&#xff1a;.sh运行操作系统&#xff1a;Linux运行环境&…

cesium从入门到进阶(一):坐标系与坐标系转换

目录 一、坐标系 1、屏幕坐标系(像素) 1.1 二维笛卡尔平面坐标Cartesian2 1.2 三维笛卡尔空间坐标(世界坐标)Cartesian3 2、地理坐标系 2.1 地理坐标系&#xff08;弧度&#xff09;Cartographic 2.2 地理坐标系&#xff08;经纬度&#xff09;WGS84 二、坐标系转换 1…

华为不丢失数据解手机屏幕锁华为售后能保资料解锁吗华为锁屏保留数据荣耀手机解锁保数据华为手机保存数据解锁

大家好&#xff0c;今天给大家分享的华为mate9手机忘记密码保资料不清除数据解锁华为手机案例分享&#xff1a;这个用户是从马来西亚邮递回国的华为p30手机进行保资料不清除数据解除华为锁屏密码&#xff0c;由于机主突然的去世&#xff0c;手机里有公司贵重的资料&#xff0c;…

27 openEuler管理网络-通过ifcfg文件配置网络

文章目录27 openEuler管理网络-通过ifcfg文件配置网络27.1 配置静态网络27.2 配置动态网络27.3 配置默认网关27 openEuler管理网络-通过ifcfg文件配置网络 说明&#xff1a; 通过ifcfg文件配置的网络配置不会立即生效&#xff0c;需要在root权限下执行systemctl reload Network…

因为需求理解不到位,视频自动播放列表又重写了

一、一定要理解需求再下手 刚接手一个旧项目&#xff0c;只需要在上面添加一些新功能&#xff0c;和后端对对接口就可以了。因为害怕总是去问别人需求惹人烦&#xff0c;所以好几次讨论给我讲需求我就说我懂了&#xff0c;然后下来自己思考怎么做。最后又因为好多需求理解不到…

【机器学习】机器学习实验一:线性回归(详细代码展示)

文章目录一、前言二、梯度下降理解算法2.1 单变量线性回归2.2 多变量线性回归2.3 正则化2.3.1 L2正则化&#xff08;Ridge回归&#xff09;2.3.2 L1正则化&#xff08;Lasso回归&#xff09;三、实验一详细代码案例一、前言 本次实验我将分为两个部分进行讲解&#xff0c;第一…

Echarts 模拟汽车速度和油量的仪表显示,两个仪表盘同图

第025个点击查看专栏目录本示例的目标是模拟汽车速度和油量的仪表显示&#xff0c;这里两个仪表盘同图&#xff0c;并倾斜一定的角度。 文章目录示例效果示例源代码&#xff08;共115行&#xff09;相关资料参考专栏介绍示例效果 示例源代码&#xff08;共115行&#xff09; /*…

ABAP中Literals的用法(untyped literal vs. typed literal)

1. 什么是Literals ? Literals的字面意思即“文字”。其实&#xff0c;Literals就是在ABAP代码中直接指定的一个字符串&#xff0c;但注意哦&#xff0c;这个字符串并不意味着其类型一定是string哦。 要弄清这个概念&#xff0c;就要清楚ABAP对于Literals 的定义和处理方式。…