SSM【Spring SpringMVC Mybatis】——Mybatis(二)

如果对一些基础理论感兴趣可以看这一期👇

SSM【Spring SpringMVC Mybatis】——Mybatis

目录

1、Mybatis中参数传递问题

1.1 单个普通参数

1.2 多个普通参数

1.3 命名参数

 1.4 POJO参数

1.5 Map参数

1.6 Collection|List|Array等参数

2、Mybatis参数传递【#与$区别】

2.1 回顾JDBC

2.2 #与$区别

2.3 #与$使用场景

3、Mybatis查询中返回值四种情况

3.1 查询单行数据返回单个对象

3.2 查询多行数据返回对象的集合

3.3 查询单行数据返回Map集合

3.4 查询多行数据返回Map集合

4、Mybatis中自动映射与自定义映射

4.1 自动映射与自定义映射

4.2 自定义映射-级联映射

4.3 自定义映射-association映射

4.4 自定义映射-collection映射

4.5 ResultMap相关标签及属性

4.6 Mybatis中分步查询

4.7 Mybatis延迟加载【懒加载】

5、Mybatis动态SQL【重点】

5.1 动态SQL概述

5.2 常用标签

5.3 示例代码

6、 Mybatis中缓存机制

6.1 缓存概述

6.2 Mybatis中的缓存概述

6.3 Mybatis缓存机制之一级缓存

6.4 Mybatis缓存机制之二级缓存

6.5 Mybatis中缓存机制之第三方缓存


1、Mybatis中参数传递问题

1.1 单个普通参数

可以任意使用:参数数据类型、参数名称不用考虑

1.2 多个普通参数

Mybatis底层封装Map结构,封装key为param1、param2....【支持:arg0、arg1、...】

1.3 命名参数

语法:

@Param(value="参数名")@Param("参数名")

位置:参数前面

注意:

底层封装Map结构

命名参数,依然支持参数【param1,param2,...】

示例代码

 /*** 通过员工姓名及薪资查询员工信息【命名参数】* @return*/public List<Employee> selectEmpByNamed(@Param("lName")String lastName,@Param("salary") double salary);

  <select id="selectEmpByNamed" resultType="employee">SELECTid,last_name,email,salaryFROMtbl_employeeWHERElast_name=#{param1}ANDsalary=#{param2}</select>

源码分析

MapperMethod对象:【命名参数底层代码入口】

命名参数底层封装map为ParamMap,ParamMap继承HashMap

ParamNameResolver对象:命名参数底层实现逻辑

final Map<String, Object> param = new ParamMap<>();int i = 0;for (Map.Entry<Integer, String> entry : names.entrySet()) {param.put(entry.getValue(), args[entry.getKey()]);// add generic param names (param1, param2, ...)final String genericParamName = GENERIC_NAME_PREFIX + (i + 1);// ensure not to overwrite parameter named with @Paramif (!names.containsValue(genericParamName)) {param.put(genericParamName, args[entry.getKey()]);}i++;}return param;

 1.4 POJO参数

Mybatis支持POJO【JavaBean】入参,参数key是POJO中属性

1.5 Map参数

Mybatis支持直接Map入参,map的key=参数key

1.6 Collection|List|Array等参数

参数名:collection、list、array

2、Mybatis参数传递【#与$区别】

2.1 回顾JDBC

在MyBatis和JDBC的背景下,让我们深入了解每个组件:

1.DriverManager(驱动管理器):这是JDBC API的一部分,负责管理数据库驱动程序的列表。当你使用DriverManager时,可以通过URL字符串获取与特定数据库的连接。DriverManager类动态加载JDBC驱动程序,这使得JDBC API可以通过JDBC驱动程序连接支持SQL的任何数据库。
2.Connection(连接):连接表示与特定数据库的会话。在MyBatis的上下文中,连接对象是从DriverManager获取的。它提供了用于创建Statement和PreparedStatement对象的方法。Connection接口允许你与数据库进行通信,并执行各种操作,如执行SQL语句、提交事务和管理连接属性。
3.Statement(语句):Statement对象用于执行静态SQL语句并返回其产生的结果。当你使用Statement时,SQL查询通常通过串联字符串构造,如果不正确处理,可能会导致SQL注入漏洞。这是在JDBC中执行SQL查询的最基本方法,但由于安全方面的考虑,不建议使用。
4.PreparedStatement(预编译语句):PreparedStatement扩展了Statement,用于执行带参数的SQL查询。与Statement不同,PreparedStatement中创建带有参数占位符(通常用问号?表示)的SQL语句。这样做可以提高性能和安全性,因为SQL语句会被数据库预编译和缓存,减少解析开销,并保护免受SQL注入攻击。
5.ResultSet(结果集):ResultSet对象表示SQL查询的结果。它提供了用于遍历和访问数据库执行查询后返回的数据的方法。通过ResultSet,你可以遍历数据行,检索列值,并对结果集执行各种操作。

2.2 #与$区别

【#】底层执行SQL语句的对象,使用PreparedStatementd,预编译SQL,防止SQL注入安全隐患,相对比较安全。

【$】底层执行SQL语句的对象使用Statement对象,未解决SQL注入安全隐患,相对不安全。

2.3 #与$使用场景

查询SQL:select col,col2 from table1 where col=? and col2=?  group by ?, order by ?  limit ?,?

#使用场景,sql占位符位置均可以使用#

$使用场景,#解决不了的参数传递问题,均可以交给$处理【如:form 动态化表名】

/*** 测试$使用场景*/public List<Employee> selectEmpByDynamitTable(@Param("tblName") String tblName);

<select id="selectEmpByDynamitTable" resultType="employee">SELECTid,last_name,email,salaryFROM${tblName}</select>

3、Mybatis查询中返回值四种情况

3.1 查询单行数据返回单个对象

/*** 通过id获取员工信息*/public Employee selectEmpById(int empId);

<select id="selectEmpById" resultType="employee">SELECTid,last_name,email,salaryFROMtbl_employeeWHEREid=#{empId}</select>

3.2 查询多行数据返回对象的集合

/*** 查询所有员工信息*/public List<Employee> selectAllEmps();

<select id="selectAllEmps" resultType="employee">SELECTid,last_name,email,salaryFROMtbl_employee</select>

注意:如果返回的是集合,那应该设置为**集合包含的类型**,而不是集合本身的类型。

3.3 查询单行数据返回Map集合

Map<String key,Object value>

字段作为Map的key,查询结果作为Map的Value

示例代码

  /*** 查询单行数据返回Map集合* @return*/public Map<String,Object> selectEmpReturnMap(int empId);

  <!--    查询单行数据返回Map集合--><select id="selectEmpReturnMap" resultType="map">SELECTid,last_name,email,salaryFROMtbl_employeeWHEREid=#{empId}</select>

3.4 查询多行数据返回Map集合

Map<Integer key,Employee value>

对象的id作为key

对象作为value

示例代码

 /*** 查询多行数据返回Map* Map<Integer,Object>* Map<Integer,Employee>*      对象Id作为:key*      对象作为:value* @return*/@MapKey("id")public Map<Integer,Employee> selectEmpsReturnMap();
<select id="selectEmpsReturnMap" resultType="map">SELECTid,last_name,email,salaryFROMtbl_employee</select>

4、Mybatis中自动映射与自定义映射

自动映射【resultType】

自定义映射【resultMap】

4.1 自动映射与自定义映射

自动映射【resultType】:指的是自动将表中的字段与类中的属性进行关联映射

自动映射解决不了两类问题  

多表连接查询时,需要返回多张表的结果集

单表查询时,不支持驼峰式自动映射【不想为字段定义别名】

自定义映射【resultMap】:自动映射解决不了问题,交给自定义映射

注意:resultType与resultMap只能同时使用一个

4.2 自定义映射-级联映射

<!--    自定义映射 【员工与部门关系】--><resultMap id="empAndDeptResultMap" type="employee"><!--  定义主键字段与属性关联关系 --><id column="id" property="id"></id><!--  定义非主键字段与属性关联关系--><result column="last_name" property="lastName"></result><result column="email" property="email"></result><result column="salary" property="salary"></result><!--        为员工中所属部门,自定义关联关系--><result column="dept_id" property="dept.deptId"></result><result column="dept_name" property="dept.deptName"></result></resultMap><select id="selectEmpAndDeptByEmpId" resultMap="empAndDeptResultMap">SELECTe.`id`,e.`email`,e.`last_name`,e.`salary`,d.`dept_id`,d.`dept_name`FROMtbl_employee e,tbl_dept dWHEREe.`dept_id` = d.`dept_id`ANDe.`id` = #{empId}</select>

4.3 自定义映射-association映射

特点:解决一对一映射关系【多对一】

示例代码

<!--    自定义映射 【员工与部门关系】--><resultMap id="empAndDeptResultMapAssociation" type="employee"><!--  定义主键字段与属性关联关系 --><id column="id" property="id"></id><!--  定义非主键字段与属性关联关系--><result column="last_name" property="lastName"></result><result column="email" property="email"></result><result column="salary" property="salary"></result><!--        为员工中所属部门,自定义关联关系--><association property="dept"javaType="com.atguigu.mybatis.pojo.Dept"><id column="dept_id" property="deptId"></id><result column="dept_name" property="deptName"></result></association></resultMap>

4.4 自定义映射-collection映射

示例代码

/*** 通过部门id获取部门信息,及部门所属员工信息*/public Dept selectDeptAndEmpByDeptId(int deptId);
<resultMap id="deptAndempResultMap" type="dept"><id property="deptId" column="dept_id"></id><result property="deptName" column="dept_name"></result><collection property="empList"ofType="com.atguigu.mybatis.pojo.Employee"><id column="id" property="id"></id><result column="last_name" property="lastName"></result><result column="email" property="email"></result><result column="salary" property="salary"></result></collection></resultMap><select id="selectDeptAndEmpByDeptId" resultMap="deptAndempResultMap">SELECTe.`id`,e.`email`,e.`last_name`,e.`salary`,d.`dept_id`,d.`dept_name`FROMtbl_employee e,tbl_dept dWHEREe.`dept_id` = d.`dept_id`ANDd.dept_id = #{deptId}</select>

4.5 ResultMap相关标签及属性

resultMap标签:自定义映射标签

id属性:定义唯一标识

type属性:设置映射类型

resultMap子标签

id标签:定义主键字段与属性关联关系

result标签:定义非主键字段与属性关联关系

column属性:定义表中字段名称

property属性:定义类中属性名称

association标签:定义一对一的关联关系

property:定义关联关系属性

javaType:定义关联关系属性的类型

select:设置分步查询SQL全路径

colunm:设置分步查询SQL中需要参数

fetchType:设置局部延迟加载【懒加载】是否开启

collection标签:定义一对多的关联关系

property:定义一对一关联关系属性

ofType:定义一对一关联关系属性类型

fetchType:设置局部延迟加载【懒加载】是否开启

4.6 Mybatis中分步查询

为什么使用分步查询【分步查询优势】?

将多表连接查询,改为【分步单表查询】,从而提高程序运行效率

示例代码

一对一

   /*** 通过员工id获取员工信息及员工所属的部门信息【分步查询】1. 先通过员工id获取员工信息【id、last_name、email、salary、dept_id】2. 再通过部门id获取部门信息【dept_id、dept_name】*/public Employee selectEmpAndDeptByEmpIdAssociationStep(int empId);

   

<select id="selectEmpAndDeptByEmpIdAssociationStep" resultMap="empAndDeptResultMapAssocationStep">selectid,last_name,email,salary,dept_idfromtbl_employeewhereid=#{empId}</select>
/*** 通过部门id获取部门信息*/public Dept selectDeptByDeptId(int deptId);

<select id="selectDeptByDeptId" resultType="dept">selectdept_id,dept_namefromtbl_deptwheredept_id=#{deptId}</select>

一对多

  /*** 通过部门id获取部门信息,及部门所属员工信息【分步查询】1. 通过部门id获取部门信息2. 通过部门id获取员工信息*/public Dept selectDeptAndEmpByDeptIdStep(int deptId);
<!--    通过部门id获取部门信息,及部门所属员工信息【分步查询】--><!--    1. 通过部门id获取部门信息--><!--    2. 通过部门id获取员工信息--><select id="selectDeptAndEmpByDeptIdStep" resultMap="deptAndEmpResultMapStep">selectdept_id,dept_namefromtbl_deptwheredept_id=#{deptId}</select>

 /*** 通过部门Id获取员工信息* @param deptId* @return*/public List<Employee> selectEmpByDeptId(int deptId);

  <select id="selectEmpByDeptId" resultType="employee">selectid,last_name,email,salary,dept_idfromtbl_employeewheredept_id=#{deptId}</select>

4.7 Mybatis延迟加载【懒加载】

需要时加载,不需要暂时不加载

优势:提升程序运行效率

语法

全局设置

<!-- 开启延迟加载 --><setting name="lazyLoadingEnabled" value="true"/><!-- 设置加载的数据是按需加载3.4.2及以后的版本该步骤可省略--><setting name="aggressiveLazyLoading" value="false"/>

局部设置

fetchType

eager:关闭局部延迟加载

 lazy:开启局部延迟加载

示例代码

<association property="dept"select="com.atguigu.mybatis.mapper.DeptMapper.selectDeptByDeptId"column="dept_id"fetchType="eager"></association>

4.8 扩展

如果分步查询时,需要传递给调用的查询中多个参数,则需要将多个参数封装成

Map来进行传递,语法如下**: {k1=v1, k2=v2....}

5、Mybatis动态SQL【重点】

5.1 动态SQL概述

动态SQL指的是:SQL语句可动态化

Mybatis的动态SQL中支持OGNL表达式语言,OGNL( Object Graph Navigation Language )对象图导航语言

5.2 常用标签

if标签:用于完成简单的判断

where标签:用于解决where关键字及where后第一个and或or的问题

trim标签: 可以在条件判断完的SQL语句前后添加或者去掉指定的字符

prefix: 添加前缀

prefixOverrides: 去掉前缀

suffix: 添加后缀

suffixOverrides: 去掉后缀

set标签:主要用于解决set关键字及多出一个【,】问题

choose标签:类似java中if-else【switch-case】结构

foreach标签:类似java中for循环

collection: 要迭代的集合

item: 当前从集合中迭代出的元素

separator: 元素与元素之间的分隔符

open: 开始字符

close:结束字符

sql标签:提取可重用SQL片段

5.3 示例代码


<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.atguigu.mybatis.mapper.EmployeeMapper"><sql id="emp_col">id,last_name,email,salary</sql><sql id="select_employee">selectid,last_name,email,salaryfromtbl_employee</sql><!-- 按条件查询员工信息【条件不确定】--><select id="selectEmpByOpr" resultType="employee"><include refid="select_employee"></include><where><if test="id != null">and id = #{id}</if><if test="lastName != null">and last_name = #{lastName}</if><if test="email != null">and email = #{email}</if><if test="salary != null">and salary = #{salary}</if></where></select><select id="selectEmpByOprTrim" resultType="employee"><include refid="select_employee"></include><trim prefix="where" suffixOverrides="and"><if test="id != null">id = #{id} and</if><if test="lastName != null">last_name = #{lastName} and</if><if test="email != null">email = #{email} and</if><if test="salary != null">salary = #{salary}</if></trim></select><update id="updateEmpByOpr">updatetbl_employee<set><if test="lastName != null">last_name=#{lastName},</if><if test="email != null">email=#{email},</if><if test="salary != null">salary=#{salary}</if></set>whereid = #{id}</update><select id="selectEmpByOneOpr" resultType="employee">select<include refid="emp_col"></include>fromtbl_employee<where><choose><when test="id != null">id = #{id}</when><when test="lastName != null">last_name = #{lastName}</when><when test="email != null">email = #{email}</when><when test="salary != null">salary = #{salary}</when><otherwise>1=1</otherwise></choose></where></select><select id="selectEmpByIds" resultType="employee">selectid,last_name,email,salaryfromtbl_employee<where>id in(<foreach collection="ids" item="id" separator=",">#{id}</foreach>)</where></select><insert id="batchInsertEmp">INSERT INTOtbl_employee(last_name,email,salary)VALUES<foreach collection="employees" item="emp" separator=",">(#{emp.lastName},#{emp.email},#{emp.salary})</foreach></insert></mapper>

6、 Mybatis中缓存机制

6.1 缓存概述

生活中缓存

缓存一些音频、视频优势

节约数据流量

提高播放性能

程序中缓存【Mybatis缓存】

使用缓存优势

提高查询效率

降低服务器压力

6.2 Mybatis中的缓存概述

一级缓存

二级缓存

第三方缓存

6.3 Mybatis缓存机制之一级缓存

概述:一级缓存【本地缓存(Local Cache)或SqlSession级别缓存】

特点

一级缓存默认开启

不能关闭

可以清空

缓存原理

 第一次获取数据时,先从数据库中加载数据,将数据缓存至Mybatis一级缓存中【缓存底层实现原理Map,key:hashCode+查询的SqlId+编写的sql查询语句+参数】

以后再次获取数据时,先从一级缓存中获取,**如未获取到数据**,再从数据库中获取数据。

一级缓存五种失效情况

  1) 不同的SqlSession对应不同的一级缓存

  2) 同一个SqlSession但是查询条件不同

  3) 同一个SqlSession两次查询期间执行了任何一次增删改操作

  4) 同一个SqlSession两次查询期间手动清空了缓存

sqlSession.clearCache()

  5) 同一个SqlSession两次查询期间提交了事务

sqlSession.commit()

6.4 Mybatis缓存机制之二级缓存

二级缓存【second level cache】概述

二级缓存【全局作用域缓存】

 SqlSessionFactory级别缓存

二级缓存特点

二级缓存默认关闭,需要开启才能使用

二级缓存需要提交sqlSession或关闭sqlSession时,才会缓存。

二级缓存使用的步骤:

  ① 全局配置文件中开启二级缓存<setting name="cacheEnabled" value="true"/>

  ② 需要使用二级缓存的**映射文件处**使用cache配置缓存<cache />

  ③ 注意:POJO需要实现Serializable接口

 

④ 关闭sqlSession或提交sqlSession时,将数据缓存到二级缓存

二级缓存底层原理

第一次获取数据时,先从数据库中获取数据,将数据缓存至一级缓存;当提交或关闭SqlSession时,将数据缓存至二级缓存

以后再次获取数据时,先从一级缓存中获取数据,如一级缓存没有指定数据,再去二级缓存中获取数据。如二级缓存也没有指定数据时,需要去数据库中获取数据,......

二级缓存相关属性

eviction=“FIFO”:缓存清除【回收】策略。

LRU – 最近最少使用的:移除最长时间不被使用的对象。

FIFO – 先进先出:按对象进入缓存的顺序来移除它们。

flushInterval:刷新间隔,单位毫秒

size:引用数目,正整数

readOnly:只读,true/false

二级缓存的失效情况

在两次查询之间,执行增删改操作,会同时清空一级缓存和二级缓存

sqlSession.clearCache():只是用来清除一级缓存。

6.5 Mybatis中缓存机制之第三方缓存

第三方缓存:EhCache

EhCache 是一个纯Java的进程内缓存框架

使用步骤

导入jar包

<!-- mybatis-ehcache --><dependency><groupId>org.mybatis.caches</groupId><artifactId>mybatis-ehcache</artifactId><version>1.0.3</version></dependency><!-- slf4j-log4j12 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.6.2</version><scope>test</scope></dependency>

编写配置文件【ehcache.xml】

<?xml version="1.0" encoding="UTF-8"?><ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"><!-- 磁盘保存路径 --><diskStore path="E:\mybatis\ehcache" /><defaultCachemaxElementsInMemory="512"maxElementsOnDisk="10000000"eternal="false"overflowToDisk="true"timeToIdleSeconds="120"timeToLiveSeconds="120"diskExpiryThreadIntervalSeconds="120"memoryStoreEvictionPolicy="LRU"></defaultCache></ehcache>

加载第三方缓存【映射文件】

开始使用

注意事项

第三方缓存,需要建立在二级缓存基础上【需要开启二级缓存,第三方缓存才能生效】

如何让第三方缓存失效【将二级缓存设置失效即可】






 

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

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

相关文章

STL——stack容器【栈】

stack基本概念&#xff1a; 概念&#xff1a; 是一种先进后出的数据结构&#xff0c;它只有一个出口 因为只有一端可以调用&#xff0c;所以栈不支持遍历操作 栈的操作&#xff1a; 栈中进入数据称为&#xff1a;入栈(push) 栈中弹出数据称为&#xff1a;出栈(pop) 生活中…

C#编程模式之享元模式

创作背景&#xff1a;各位朋友&#xff0c;我们继续学习C#的编程模式&#xff0c;本文主要介绍享元模式。享元模式是一种结构型设计模式&#xff0c;它主要用于减少创建对象的数量&#xff0c;从而提高程序性能。它通过共享对象的方式来减少内存的使用&#xff0c;特别是系统中…

【多客陪玩】陪玩小程序源码APP+小程序+公众号开发 -源码交付,线下可爆改家政,整理师等功能

简述 随着电竞行业的快速发展&#xff0c;电竞陪玩APP正在逐渐成为用户在休闲娱乐时的首选。为了吸引用户和提高用户体验&#xff0c;电竞陪玩APP开发需要定制一些特色功能&#xff0c;并通过合适的盈利模式来获得收益。本文将为您介绍电竞陪玩APP开发需要定制的特色功能以及常…

深入学习指针3

目录 前言 1.二级指针 2.指针数组 3.指针数组模拟二维数组 前言 Hello,小伙伴们我又来了&#xff0c;上期我们讲到了数组名的理解&#xff0c;指针与数组的关系等知识&#xff0c;那今天我们就继续深入到学习指针域数组的练联系&#xff0c;如果喜欢作者菌生产的内容还望不…

Python GraphQL服务器实现库之tartiflette使用详解

概要 Tartiflette是一个为Python编写的GraphQL服务器实现,它建立在现代异步编程库如asyncio之上,提供了高性能的GraphQL执行环境。Tartiflette专注于提供最佳的开发者体验,支持最新的GraphQL特性。 安装 安装Tartiflette相对简单,但需要依赖于一些系统级的库。 首先,需…

ORACLE ODA一体机存储节点电源故障的分析处理

近期&#xff0c;某用户的ORACLE ODA一体机在例行机房巡检时出现亮黄灯告警&#xff1b;用户反馈次问题后我们立刻通过远程方式&#xff0c;登陆ODA的控制台进行查看&#xff1b; 对于ODA一体机&#xff08;2个计算节点1个存储节点&#xff09;&#xff0c;计算节点可以通过il…

Python爬虫实战:爬取【某旅游交通出行类网站中国内热门景点】的评论数据,使用Re、BeautifulSoup与Xpath三种方式解析数据,代码完整

一、分析爬取网页&#xff1a; 1、网址 https://travel.qunar.com/2、 打开网站&#xff0c;找到要爬取的网页 https://travel.qunar.com/p-cs299979-chongqing进来之后&#xff0c;找到评论界面&#xff0c;如下所示&#xff1a;在这里我选择驴友点评数据爬取点击【驴友点评…

腾讯共享WiFi项目的加盟方式有哪些?

在这个互联互通的时代&#xff0c;共享经济的浪潮正以前所未有的力量席卷全球&#xff0c;而腾讯作为中国互联网巨头之一自然不会错过这场盛宴。其推出的腾讯共享WiFi项目自问世以来就备受瞩目&#xff0c;它不仅为用户提供便捷的上网服务&#xff0c;更为创业者打开了一个全新…

untiy 为预制体动态加载光照贴图

unity版本为2021.8 预制体不能携带光照贴图信息&#xff0c;只能我们自己准备了 多方查找加自己摸索终于找到了适合新版本的解决方案&#xff0c;直接贴代码 将这个脚本挂到预制体的最上级 using System.Collections; using System.Collections.Generic; using UnityEditor; …

美颜SDK是什么?深度学习技术在直播美颜SDK中的应用探析

美颜SDK的出现为直播、视频通话等应用提供了强大的美颜功能。接下来&#xff0c;我们将一同探讨美颜SDK的概念&#xff0c;以及深度学习技术在直播美颜SDK中的应用。 一、什么是美颜SDK&#xff1f; 美颜SDK是一种软件开发工具包&#xff0c;旨在为开发者提供便捷而强大的美颜…

四大误区:中台产品时设计你中招了几个?

01 误区一&#xff1a;管理系统分析工具数字化中台 传统企业在经营管理过程中会根据业务或管理需求&#xff0c;不断添加和升级诸如OA、CRM等不同类别的管理系统。 为了更好地响应前台的业务需求&#xff0c;有些企业成立了新的或扩大、加强了原有的技术部门&#xff0c;由…

C#上位机1ms级高精度定时任务

precisiontimer 安装扩展包 添加引用 完整代码 using PrecisionTiming;using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; us…

WinSCP软件出错:连接被意外关闭了

问题描述&#xff1a; WinSCP 登录 M3568 的 linux系统&#xff0c;提示 列出’/home/root’的目录项时出错&#xff0c;连接被意外关闭 具体提示如下图所示&#xff0c;列出’/home/root’的目录项时出错。 连接被意外关闭了 服务器发送命令的退出状态255 原因及解决&#xf…

notepad++安装 hex-editor插件

打开notepad 点击插件 搜索 hex-editor,点击右侧 安装install 安装成功后&#xff0c;在已安装插件中就有显示了

spring boot参数验证注解@NotNull、@NotBlank和@NotEmpty区别

目录 前言说明举例 前言 使用spring boot参数验证是常常会使用NotNull、NotBlank和NotEmpty三个判断是否不为空的注解&#xff0c;中文都有不能为空的意思&#xff0c;大部分使用者都傻傻分清它们之间到底有什么区别。今天就让咱们来一起探索它们之间的不同吧。 说明 注解名…

【数据库】数据库指令

一。数据库打开 1.命令行 2.进入mysql mysql -uroot -p密码 3.退出 exit&#xff1b; 二。针对数据库的操作 1.创建数据库&#xff08;有分号&#xff09; create database student; 2.使用数据库 use student 3.删除数据库&#xff08;有分号&#xff09; drop database…

数据库调优-数据库优化

数据库优化 如何发现复杂的SQL有问题&#xff1f; 一个个去explain吗&#xff1f;你有没有这样的困惑&#xff0c;开发代码运行顺畅丝滑&#xff0c;上生产了却卡的一逼&#xff1f; 哈哈&#xff0c;相信大家都会遇到这样的问题&#xff01; sql 复制代码 # 举个栗子&…

4. 从感知机到神经网络

目录 1. 从感知机到神经网络 2. 最简单的神经网络 3. 激活函数的引入 1. 从感知机到神经网络 之前章节我们了解了感知机&#xff0c;感知机可以处理与门、非与门、或门、异或门等逻辑运算&#xff1b;不过在感知机中设定权重的工作是由人工来做的&#xff0c;而设定合适的&a…

【将Maven源改为国内阿里云镜像源】

目录 一、如何配置Maven镜像源&#xff1f; 二、Idea中的Maven配置 ​三、项目与你本地仓库和中央仓库的联系 一、如何配置Maven镜像源&#xff1f; 1、打开你的Maven用户设置文件(settings.xml)。默认情况下&#xff0c;该文件存在于你的用户目录下的.m2文件夹中。如果你没…

Kafka 执行命令超时异常: Timed out waiting for a node assignment

Kafka 执行命令超时异常&#xff1a; Timed out waiting for a node assignment 问题描述&#xff1a; 搭建了一个kafka集群环境&#xff0c;在使用命令行查看已有topic时&#xff0c;报错如下&#xff1a; [rootlocalhost bin]# kafka-topics.sh --list --bootstrap-server…