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>
加载第三方缓存【映射文件】
开始使用
注意事项
第三方缓存,需要建立在二级缓存基础上【需要开启二级缓存,第三方缓存才能生效】
如何让第三方缓存失效【将二级缓存设置失效即可】
相关文章:

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参数传递【#与…...

在线教育系统在线网校报价,培训机构是怎样招聘老师的?流程是什么?
招生是培训机构的一大难题,但招不来老师,招不到好老师却也是培训机构面临的一个更为严峻的问题,没有老师,教学工作就展不开,没有老师,学生就留不住。培训学校的人员招聘不要等缺失时才去招聘,要…...

您的文件和驱动器上的“密码保护”有多安全?
某些行业(例如医疗保健、法律和公司)的人们在通过电子邮件发送文件时通常依赖密码保护,认为它可以提供足够的安全性来防止窥探。然而,对 PDF 或 Excel 文件进行简单的密码保护并不像看起来那样万无一失。 使用密码保护文件而不加…...

4000字超详解Linux权限
各位大佬好 ,这里是阿川的博客 , 祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 在Linux当中权限的体现主要有两种 普通用户 超…...

SearXNG - 一个注重隐私的互联网元搜索引擎
引言 在数字监控和数据货币化的时代,对于许多用户而言,在线保护个人信息变得至关重要。隐私问题特别突出的一个领域是搜索引擎,它们经常收集用户数据以定制个性化广告或构建用户档案。SearXNG 是一个开源的元搜索引擎,它汇集了各…...

(第15天)【leetcode题解】459、重复的子字符串
目录 459、重复的子字符串题目描述暴力匹配思路代码 字符串匹配思路代码与暴力匹配的不同 KMP解法思路代码KMP算法的核心和用途 459、重复的子字符串 题目描述 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。 暴力匹配 思路 推理 如果…...

PostgreSQL的学习心得和知识总结(一百四十二)|深入理解PostgreSQL数据库数据库之 Continuous Integration
目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《PostgreSQL数据库内核分析》 2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》 3、PostgreSQL数据库仓库…...

【外币兑换,简单贪心】
小明刚从美国回来,发现手上还有一些未用完的美金,于是想去银行兑换成人民币。可是听说最近人民币将会升值,并从金融机构得到了接下来十二个月可能的美元对人民币汇率,现在,小明想要在接下来一年中把美金都兑换成人民币…...

数据库入门(sql文档+命令行)
一.基础知识 1.SQL(Structured Query Language)结构化查询语言分类: DDL数据定义语言用来定义数据库对象:数据库、表、字段DML数据操作语言对数据库进行增删改查DQL数据查询语言查询数据库中表的信息DCL数据控制语言用来创建数据…...
【机器学习300问】84、AdaGrad算法是为了解决什么问题?
神经网络的学习的目的是找到使损失函数的值尽可能小的参数。这是寻找最优参数的问题,解决这个问题的过程称为最优化。因为参数空间非常复杂,无法轻易找到最优解,而且在深度神经网络中,参数的数量非常庞大,导致最优化问…...

Java算法-力扣leetcode-14. 最长公共前缀
14. 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 示例 1: 输入: strs ["flower","flow","flight"] 输出: "fl"示…...

视频拼接融合产品的产品与架构设计(二)
视频拼接融合产品的产品与架构设计一 以上是第一期,以前思考的时候还是比较着急,现在思考的更多了,现实世界的拼接更加需要我们沉下心来做,尤其是对于更多画面,画面更加清晰怎么做 本篇章不在于其他功能,在…...

【docker 】push 镜像到私服
查看镜像 docker images把这个hello-world 推送到私服 docker push hello-world:latest 报错了。不能推送。需要标记镜像 标记Docker镜像 docker tag hello-world:latest 192.168.2.1:5000/hello-world:latest 将Docker镜像推送到私服 docker push 192.168.2.1:5000/hello…...

Java框架精品项目【用于个人学习】
源码获取:私聊回复【项目关键字】获取 更多选题参考: Java练手项目 & 个人学习等选题参考 推荐菜鸟教程Java学习、Javatpoint学习 前言 大家好,我是二哈喇子,此博文整理了各种项目需求 此文下的项目用于博主自己学习&#x…...

每周一算法:无向图的最小环
题目链接 观光之旅 题目描述 给定一张无向图,求图中一个至少包含 3 3 3 个点的环,环上的节点不重复,并且环上的边的长度之和最小。 该问题称为无向图的最小环问题。 你需要输出最小环的方案,若最小环不唯一,输出…...

分布式websocket IM即时通讯聊天开源项目如何启动
前言 自己之前分享了分布式websocket的视频有同学去fork项目了,自己启动一下更方便理解项目嘛。然后把项目启动需要的东西全部梳理出来。支持群聊单聊,表情包以及发送图片。 支持消息可靠,消息防重,消息有序。同时基础架构有分布式权限&…...

tensorflow学习笔记(1)环境准备写个简单例子(小白手册)-20240506
一、安装python、tensorflow 1、Mac上默认python已经安装,自带pip 2、pip3 install tensorflow 如果报错,提示pip3版本较低,可以根据提示来更新pip3:/Library/Developer/CommandLineTools/usr/bin/python3 -m pip install --upgrade pip 3、然后再使用pip3来安装tensor…...

kubernate 基本概念
一 K8S 是什么? K8S 全称:Kubernetes 1 kubernate基本概念 作用: 用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。 可以理解成 K8S 是负责自动化运维管理多个容器化程序(比如…...

【系统架构师】-选择题(十二)计算机网络
1、网闸的作用:实现内网与互联网通信,但内网与互联网不是直连的 2、管理距离是指一种路由协议的路由可信度。15表示该路由信息比较可靠 管理距离越小,它的优先级就越高,也就是可信度越高。 0是最可信赖的,而255则意味…...

代码随想录|总结篇
完结篇: 60天,还是坚持了下来,达成算法路上的一个小目标。 加入代码随想录训练营之前,也断断续续刷到了树那一章节,但后面因为导师项目等种种情况,一直耽搁到年后。年后打算重新开始刷题时,正好…...

网络编程套接字和传输层tcp,udp协议
认识端口号 我们知道在网络数据传输的时候,在IP数据包头部有两个IP地址,分别叫做源IP地址和目的IP地址。IP地址是帮助我们在网络中确定最终发送的主机,但是实际上数据应该发送到主机上指定的进程上的,所以我们不仅要确定主机&…...

通过wget下载ftp文件
通过wget下载ftp文件 基础用法带密码的http文件带密码的ftp文件补充 基础用法 在下载的过程中会显示进度条,包含百分比,已下载字节,下载速度,剩余时间。 # 下载单个文件 wget [url_file]# 下载目录全部文件 wget [url_dir/*] wg…...

Acrobat Pro DC 2023 for Mac:PDF处理的终极解决方案
Acrobat Pro DC 2023 for Mac为Mac用户提供了PDF处理的终极解决方案。它具备强大的文档处理能力,无论是查看、编辑还是创建PDF文件,都能轻松胜任。在编辑功能方面,Acrobat Pro DC 2023支持对文本、图像进行精准的修改和调整,还能添…...

map容器
目录 map构造和赋值 map大小和交换 map插入和删除 map查找和统计 map排序 map构造和赋值 map中所有元素都是pair(即一对) pair中第一个元素为key(键值),起到索引作用,第二个元素为value(…...

GNU/Linux - 是否可以多次打开同一个设备文件
使用设备/dev/ttyS1举例来说明。 一个设备文件打开多次 在 Linux 中,多次打开 /dev/ttyS1 以读取数据通常是可以接受的。多次打开 /dev/ttyS1 并向 /dev/ttyS1 发送数据时,所有打开的文件描述符都能接收数据。每个打开的文件描述符都代表与串行端口的独立…...

Visual Studio的使用方法
目录 1. 下载软件 2. 软件安装 3. 软件使用 4. VS工具的字体背景美化 5. 程序调试 1. 下载软件 官网地址:Visual Studio 2022 IDE - 适用于软件开发人员的编程工具 (microsoft.com) 2. 软件安装 1.选中vs_Professional,鼠标右击选择“以管理员身份…...

【35分钟掌握金融风控策略18】贷前风控策略详解-3
目录 编辑 贷前风控数据源 第三方数据 贷前风控数据源 第三方数据 在金融风控过程中,金融机构通常会引入一些第三方的风控数据(或第三方金融技术)来辅助识别贷款个人或贷款企业的风险状况,帮助金融机构进行风控决策&#x…...

秋招后端开发面试题 - MySQL事务
目录 MySQL事务前言面试题什么是数据库事务为什么要有事务呢?项目中遇到的事务事务的传播机制事务的特性?事务并发存在的问题四大隔离级别四大隔离级别,都会存在哪些并发问题呢数据库是如何保证事务的隔离性的呢?如何解决加锁后的…...

C语言栈的含义与栈数据操作代码详解!
引言:在本篇博客中,我们将学到数据结构——栈,讲到栈的含义与关于栈的数据操作代码。栈可以在顺序表、双向链表以及单链表的基础上实现,而于本篇博客中,我们选择在顺序表的基础上实现栈。 更多有关C语言和数据结构知识…...

数据库基础语法二
一、数据库 1、登陆数据库 2、创建数据库zoo 3、修改数据库zoo字符集为gbk 4、选择当前数据库为zoo 5、查看创建数据库zoo信息 6、删除数据库zoo mysql -uroot -p #登陆数据库 create database zoo; #创建数据库zoo alter database zoo character set gbk collate gbk_…...