后端框架(1):Mybatis
什么是框架?
盖高楼,框架结构。
框架结构就是高楼的主体,基础功能。
把很多基础功能已经实现了(封装了)。
在基础语言之上,对各种基础功能进行封装,方便开发者,提高开发效率。
mybatis:对jdbc进行封装
spring:对整个java后端架构进行管理的
springweb:对servlet层进行封装
springboot:对spring框架的搭建进行封装
Mybatis
介绍:
mybatis原来是Apache下main的一个开源项目,名为ibatis
后转移到谷歌旗下,改名为mybatis
mybatis是一个优秀的数据持久层框架(数据持久层:dao层 数据访问层)
mybatis是对jdbc进行的封装,避免了jdbc中手动设置参数,手动映射结果的操作
mybatis将jdbc中的接口进行封装,提供了他自己的类和接口实现
mybatis可以使用xml配置和注解的方式,将数据库中记录自动映射到java对象中,是一种ORM实现(对象关系映射)将可以自动将数据映射到对象中的这种框架,也称为orm框架
mybatis还提供了动态sql 和 数据缓存
mybatis搭建
Mybatis 中文官网 mybatis – MyBatis 3 | 简介
1、创建一个maven项目
2、在pom.xml导入mabatis依赖的jar
<!--mybatis--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.2</version></dependency><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version></dependency>
3、创建一个全局的mybatis配置文件
在main文件夹中的recources里面创建一个名为mybatis.xml文件
在mybatis.xml文件中配置核心全局相关信息等操作
配置数据库连接
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTDConfig3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--配置数据库连接相关信息--><environments default="development"><environment id="development"><transactionManager type="JDBC"/><!--type="POOLED" 使用数据库连接池功能,默认创建10个连接对象,减少频繁创建销毁连接对象--><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://127.0.0.1:3306/ssmdb?serverTimezone=Asia/Shanghai"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments></configuration>
4、创建数据库,创建表,准备数据
在mysql中创建例如名为ssmdb的数据库,在此库中创建名为admin的表
5、创建一个访问接口,定义方法
在java中先创建好每个层所需要的包
然后在dao层中创建AdminDao的接口
public interface AdminDao {Admin findAdminById(int id);
}
6、创建接口对应的sql映射文件,编写sql
依旧在recources里面先创建名为mappers的文件夹(里面都放着一些sql映射文件),在mappers里创建一个名为AdminMapper.xml文件并编写sql
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace = "com.ffyc.mabatispro.dao.AdminDao"><select id="findAdminById" parameterType="int" resultType="com.ffyc.mybatis.model.Admin">select * from admin where id = #{id}</select>
</mapper>
再在mybatis.xml文件中将AdminMapper.xml文件注册配置
<!--注册映射文件--><mappers><mapper resource="mappers/AdminMapper.xml"></mapper></mappers>
7、测试mybatis
单表查询
创建一个test类
public class Test1 {public static void main(String[] args) throws IOException {//1.mybatis读取配置文件Reader resourceAsReader = Resources.getResourceAsReader("mybatis.xml");//2.创建 SqlSessionFactory,负责创建SqlSession对象(连接数据库的会话对象,类似Connection)//sqlSessFactory对象也是只需要创建一个,创建后不需要销毁SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsReader);//3.创建SqlSession对象SqlSession sqlSession = sqlSessionFactory.openSession();//4.创建接口的代理对象AdminDao adminDao = sqlSession.getMapper(AdminDao.class);//5.调用Admin admin = adminDao.findAdminById(1);//让代理对象帮我们调用映射文件在与此接口中相同名称的方法System.out.println(admin);//6.关闭会话对象sqlSession.close();//关闭与数据库的连接对象}
}
控制台所展现的是实现了日志功能后的结果(后面有日志功能的配置)
7.1增加
在AdminDao中写方法
void insertAdmin(Admin admin);
在AdminMapper.xml中写sql映射语句
<!--useGeneratedKeys="true" 返回自增主键keyProperty="id" 定义接收属性keyColumn="id" 定义主键列-->
<insert id="insertAdmin" parameterType="Admin" useGeneratedKeys="true" keyProperty="id" keyColumn="id">insert into admin(account,password,gender) values (#{account},#{password},#{gender})</insert>
@Testpublic void insert(){Admin admin = new Admin();admin.setAccount("ccc");admin.setPassword("123");admin.setGender("男");SqlSession sqlSession = MybatisUtil.getSqlSession();AdminDao adminDao = sqlSession.getMapper(AdminDao.class);adminDao.insertAdmin(admin);//保存数据后端,需要立刻拿到这条数据在数据库的主键sqlSession.commit();sqlSession.close();}
@Test:单元测试,程序员使用的测试方式,以方法为单位进行测试 使用junit组件实现单元测试
在maven中配置junit组件
<!--junit--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>provided</scope></dependency>
sqlSession.commit();//提交数据库事务,当我们的程序代码执行没有任何问题时,再向数据库发送提交事务操作,数据库真正执行sql,出现异常则不提交事务(新增,修改,删除完毕后,都需要手动提交事务)/*数据库事务:是数据库的一种管理的机制,是对一次连接数据库过程的管理保证一次操作中,执行的多条sql,要么都成功执行,要么都不执行提交事务 数据库才会真正的在数据库执行这一次操作中的多条sql*/
7.2删除
void deleteAdmin(int id);
<delete id="deleteAdmin" parameterType="int">delete from admin where id = #{id}</delete>
7.3修改
void updateAdmin(Admin admin);
<update id="updateAdmin" parameterType="Admin">update admin set account=#{account},password=#{password} where id = #{id}</update>
7.4查找
Admin findAdminByAccount(String account);
<select id="findAdminByAccount" parameterType="string" resultType="Admin">select * from admin where account = #{account}</select>
搭建补充:
1、在idea中安装mybatisX插件
在setting中找到MybatisX插件并下载下来,若没显示相关图标重启Idea即可
2、数据库连接池
链接数据库 每次访问数据库时候,创建一个Connection,用完关闭,但是访问量大了之后,每次都要创建新的连接对象,用完关闭,比较耗时
使用数据库连接池,在池(集合)中先创建一些连接对象
用户访问时,就直接在池中获取一个连接对象
用完不销毁,还回到池中
这样就减少频繁创建销毁连接对象
<dataSource type="POOLED">
<!--type="POOLED" 使用数据库连接池功能,默认创建10个连接对象,减少频繁创建销毁连接对象-->
3、配置日志功能
<!--配置日志功能-->
<settings><setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
4、为类配置别名
<!--为类配置别名-->
<typeAliases><!--<typeAlias type="com.ffyc.mybatispro.model.Admin" alias="Admin"></typeAlias>--><package name="com.ffyc.mybatispro.model"/>
</typeAliases>
对象映射
如果表中的类名与类中的属性名完全相同,mybatis会自动将查询结果封装 到POJO对象中.
如果java中使用标准驼峰命名,数据库中使用下划线连接命名,可以开始全局 设置实现自动转换
<!--设置驼峰命名自动映射--><setting name="mapUnderscoreToCamelCase" value="true"/>
#{}:是占位符,是采用预编译方式向sql中传值,可以防止sql注入,如果我们往sql中传值,就使用#{}
${}:是将内容直接拼接到sql语句中,一般不用于向sql中传值,用于向sql中动态传递列名
#{}与${}之间的区别:
1、底层实现不同
#{} 采用预编译方式,防止sql注入,更加安全
${} 采用字符串拼接,直接将值拼接到sql中
2、使用场景不同
#{} 一般我们用于向sql中的列传值
${} 一般用于向sql动态传递列名
例如:排序时,order by 后面的列名是可以改变
select时,后面的列名也可以自由选择
List<Admin> findAdmins1(@Param("Column") String Column);
<!--${}的实用案例--><select id="findAdmins1" resultType="Admin" parameterType="string">select * from admin order by ${Column} desc</select>
@Testpublic void find3 (){SqlSession sqlSession = MybatisUtil.getSqlSession();AdminDao adminDao = sqlSession.getMapper(AdminDao.class);adminDao.findAdmins1("id");//${}的用法sqlSession.commit();sqlSession.close();}
多表查询
关联查询(一对一)
以学生和专业为例
方式一:直接多表关联查询
(1)当查询一个学生和他所在的专业时(返回的为一个学生对象)
<!--关联查询方式1:直接多表关联查询出我们需要的数据(一对一)--><select id="findStudentById" resultMap="studentMap">selects.id,s.num,s.name,s.gender,m.name mnamefrom student s inner join major m on s.majorid = m.id where s.id = #{id}</select>
<!--对关联查询到的学生信息进行自定义映射封装--><resultMap id="studentMap" type="student"><id column="id" property="id"></id><result column="num" property="num"></result><result column="name" property="name"></result><result column="gender" property="gender"></result><!--映射关联数据 专业名称 首先会创建一个Major对象,然后将专业名称封装到Major对象,最后将Major对象封装到Student对象中去--><association property="major" javaType="Major"><result column="mname" property="name"></result></association></resultMap>
(2)查询所有学生(返回的为多个学生对象,应创建一个学生类集合存放)可以共用resultMap
<select id="findStudents" resultMap="studentMap">selects.id,s.num,s.name,s.gender,m.name mnamefrom student s inner join major m on s.majorid = m.id</select>
方式二:嵌套查询
<!--关联查询方式2:嵌套查询 先查询主表(学生表)(一对一)--><select id="findStudentById1" resultMap="studentMap1">select id,num,name,gender,majorid from student where id = #{id}</select><!--嵌套查询学生关联的专业--><select id="findMajorById" resultType="Major">select name from major where id = #{majorid}</select>
<resultMap id="studentMap1" type="Student"><id column="id" property="id"></id><result column="num" property="num"></result><result column="name" property="name"></result><result column="gender" property="gender"></result><!--封装关联表数据--><association property="major" javaType="Major" select="findMajorById" column="majorid"></association></resultMap>
在一对一查询时,resultMap中要用到<association>标签用于想要关联的表上
<association>中:property="" 表示所要映射到的哪个成员变量上
javaType="" 表示所映射的成员变量的数据类型
select="" 表示映射的成员变量的查询语句
column="" 表示映射的成员变量要以上一个查询的某一列数据作为查询条件
关联查询(一对多)
方式一:直接多表关联查询
(1)查询一个专业时,可以将查询到的多个学生封装到一个集合中
<select id="findMajorById" resultMap="majorMap">selectm.id,m.name,s.num,s.name snamefrom major m inner join student s on m.id = s.majorid where m.id = #{id}</select>
<resultMap id="majorMap" type="Major"><id column="id" property="id"></id><result column="name" property="name"></result><!--将查询关联到的多个结果封装到集合--><collection property="students" javaType="List" ofType="Student"><result column="num" property="num"></result><result column="sname" property="name"></result></collection></resultMap>
(2)查询所有专业和每个专业的学生
有些专业目前还没有学生,所以关联要用left join
<select id="findMajors" resultMap="majorMap">selectm.id,m.name,s.num,s.name snamefrom major m left join student s on m.id = s.majorid</select>
方式二:分成两次查询
<select id="findMajors1" resultMap="majorMap1">select id,name from major</select><select id="findStudents" resultType="Student">select num,name from student where majorid = #{id}</select>
<resultMap id="majorMap1" type="Major"><id column="id" property="id"></id><result column="name" property="name"></result><collection property="students" javaType="List" ofType="Student" select="findStudents" column="id"></collection></resultMap>
在一对多查询时,resultMap中要用到<collection>标签用于想要关联的表上
<collection>标签中:property="" 表示所要映射到的哪个成员变量上
javaType="" 表示映射的成员变量的类型
ofType="" 表示映射的成员变量的类型里的数据类型
select="" 表示映射的成员变量的查询语句
column="" 表示映射的成员变量要以上一个查询的某一列数据作为查询条件
动态SQL问题
以前在写sql查询语句时,难免会遇到一些多个条件一起查询的时候,当我们将每个条件都输入时才会出现一条结果。但如果在其中一个条件不成立时,就要修改sql语句,非常痛苦!
在之前的动态sql语句中,例如:(借助Mybatis去展示原始动态sql问题)
<!--原始动态sql-->
<select id="teachers" resultType="Teacher">select * from teacherwhere <if test="num!=null">num = #{num}</if><if test="name!=null">and name = #{name}</if><if test="gender!=null">and gender = #{gender}</if></select>
当其中一个条件不成立或者多个条件不成立就会出现以下结果:
你的sql语句参差不齐,要么多关键字,要么关键字之间无sql语句
在之前对动态sql语句解决的办法就是在where后面自己加一个判断条件,让它永远成立,保证不管条件有没有成立,sql语句优先保证无误
<!--以前解决动态sql问题的解法--><select id="teachers" resultType="Teacher">select * from teacherwhere 1=1<if test="num!=null">num = #{num}</if><if test="name!=null">and name = #{name}</if><if test="gender!=null">and gender = #{gender}</if></select>
现在,在Mybatis里就增加了多种标签用于解决动态SQL问题
1、if标签
test属性条件成立 执行if标签体,不成立就不执行
<select id="teachers" resultType="Teacher">select * from teacherwhere 1=1<if test="num!=null">num = #{num}</if><if test="name!=null">and name = #{name}</if><if test="gender!=null">and gender = #{gender}</if></select>
2、where标签
当where标签 if语句有条件成立时,就会动态添加where关键字 还可以删除where后面紧跟着的关键字,例如and、or
<select id="teachers" resultType="Teacher">select * from teacher<where><if test="num!=null">num = #{num}</if><if test="name!=null">and name = #{name}</if><if test="gender!=null">and gender = #{gender}</if></where></select>
3、trim标签
当条件判断有成立时,可以自定义前缀关键字和后缀关键字
prefix="" 自定义关键字
prefixOverrides="" 覆盖指定的关键字
<select id="teachers" resultType="Teacher">select * from teacher<trim prefix="where" prefixOverrides="and|or"><if test="num!=null">num = #{num}</if><if test="name!=null">name = #{name}</if><if test="gender!=null">gender = #{gender}</if></trim></select>
4、foreach标签
<select id="findTeacher" resultType="Teacher">select<foreach item="col" collection="list" separator=",">${col}</foreach>from teacher</select>
<foreach>标签中:item="" 表示col变量存储遍历到当前的值
collection="" 表示遍历集合类型
特殊字符的转义
在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理。
遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直接原封不动的输出。
语法:<![CDATA[ 内容 ]]><![CDATA[<itcast><br/></itcast>]]>
对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理。
特殊字符 | 替代符号 |
& | & |
< | < |
> | > |
" | " |
, | ' |
缓存
数据缓存 让数据离我们的执行程序更近。让程序能够更快速的获取到数据
手机缓存,浏览器缓存......cpu缓存等等
有缓存,查询下的查询流程
先从缓存中查询,缓存中如果没有,去数据库查询,查询到后把数据放到缓存中,下次直接从缓存中获取
mybatis一级缓存
mybatis一级缓存,默认是SqlSession级别的,在同一个SqlSession中查询到数据先缓存到SqlSession对象中
第二次查询数据时,先从SqlSession中查询,如果有直接返回,没有,再去查询数据库
一级缓存生命周期:
开始于SqlSession创建
结束于SqlSession关闭。如果期间执行了新增、修改、删除操作也会清空当前SqlSession对象中的缓存数据
mybatis二级缓存
二级缓存是SqlSessionFactory级别的,可以让多个SqlSession共享数据
mybatis默认没有开启二级缓存,使用时需要配置开启
如果开启了二级缓存,当SqlSession关闭时,会将一级缓存中的数据存储到二级缓存中。
其他的SqlSession就可以查询二级缓存之前SqlSession查询的数据
二级缓存的配置:
1、在mybatis.xml配置文件中设置二级缓存的开关
<!--全局二级缓存开关--><setting name="cacheEnabled" value="true"/>
2、在对应的模型类里去实现 Serializable 接口
import java.io.Serializable;public class Teacher implements Serializable
3、在SQL 映射文件中添加一行:
<cache></cache>
<!--映射语句文件中的所有 select 语句的结果将会被缓存。映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。-->
相关文章:

后端框架(1):Mybatis
什么是框架? 盖高楼,框架结构。 框架结构就是高楼的主体,基础功能。 把很多基础功能已经实现了(封装了)。 在基础语言之上,对各种基础功能进行封装,方便开发者,提高开发效率。 mybatis:对jd…...

linux下tcp/ip网络通信笔记1,
本文章主要为博主在学习网络通信的笔记一个Udp_echo_server,和client的代码实现 1,网络发展,网络协议,意识到网络通信——不同主机的进程间通信, 2,学习如何在应用层调用系统提供的接口进行通信,echo_Udp…...
SqlHelper 实现类,支持多数据库,提供异步操作、自动重试、事务、存储过程、分页、缓存等功能。
/// <summary> /// SqlHelper 实现类,支持多数据库,提供异步操作、自动重试、事务、存储过程、分页、缓存等功能。 /// </summary> public class SqlHelper : IDbHelper {private readonly IDbConnectionFactory _connectionFactory;private…...

语音识别——声纹识别
通过将说话人的声音与数据库中的记录声音进行比对,判断说话人是否为数据库白名单中的同一人,从而完成语音验证。目前,3D-Speaker 声纹验证的效果较为出色。 3D-Speaker 是一个开源工具包,可用于单模态和多模态的说话人验证、说话…...

window 显示驱动开发-报告图形内存(三)
图形内存报告示例 示例 1:笔记本电脑上的 128 MB 专用板载图形内存 以下屏幕截图显示了使用 Intel Iris 离散图形适配器运行 Windows 11 的 Surface 笔记本电脑的计算图形内存数。 适配器的可用内存总数为 16424 MB,用于图形用途,细分如下&…...
安全运维 -- linux磁盘挂载到windows
0x00 背景 一个需求需要将linux服务器文件同步到windows。在此过程中遇到了三连报错,特此记录一下。 0x00 error 1 一开始死活挂不上,报错 mount: /mnt/Folder: mount(2) system call failed: No route to host. 一开始以为是dns问题,其实…...
使用 Apache POI 生成 Word 文档
创建一个包含标题、段落和表格的简单文档。 步骤 1:添加依赖 确保你的项目中已经添加了 Apache POI 的依赖。如果你使用的是 Maven,可以在 pom.xml 中添加以下内容: <dependency><groupId>org.apache.poi</groupId>...
高防服务器流量“清洗”什么意思
在当今数字化的时代,网络安全成为了备受关注的焦点。其中,高防服务器流量“清洗”这个概念,对于许多朋友来说可能还比较陌生。今天,就让我们一起来揭开它神秘的面纱。 首先,咱们得明白,高防服务器流量“清…...

UE5 GAS框架解析内部数据处理机制——服务器与客户端
当, gas通过点击鼠标光标触发事件时,内部的处理机制。 当通过点击事件,命中中目标时, 可获取到对应的TargetData 目标数据。处理相应的操作。 仅有本地的客户端的情况下。命中并不会有什么异常。 当存在服务器时, 服…...
Unity实用技能-UI定位总结
实用技能系列 Unity实用技能-UI滑动条技能总结Unity实用技能-UI规范总结Unity实用技能-协作规范总结Unity实用技能-UI与粒子效果总结 文章目录 实用技能系列前言什么是定位UI怎么实现定位UI总结 前言 本周接触了UI和定位相关的工作,记录一下 什么是定位UI 一般就是…...

开源GPU架构RISC-V VCIX的深度学习潜力测试:从RTL仿真到MNIST实战
点击 “AladdinEdu,同学们用得起的【H卡】算力平台”,H卡级别算力,按量计费,灵活弹性,顶级配置,学生专属优惠。 一、开篇:AI芯片架构演变的三重挑战 (引述TPUv4采用RISC-V的行业案…...
服务间的“握手”:OpenFeign声明式调用与客户端负载均衡
现在,假设我们有一个新的order-service,它在创建订单时需要获取用户信息。 如果order-service直接硬编码user-service的IP和端口进行调用,会面临以下问题: 缺乏弹性: 如果user-service实例的IP或端口发生变化(在云环境…...
26、DAPO论文笔记(解耦剪辑与动态采样策略优化,GRPO的改进)
DAPO论文笔记 1、项目背景与目标2、DAPO算法与关键技术3、过长响应奖励塑形(Overlong Reward Shaping)**一、问题背景:截断惩罚的缺陷****二、解决方案:分层惩罚与软截断策略**1. **过长过滤:屏蔽无效惩罚**2. **软过长…...
JQuery 禁止页面滚动(防止页面抖动)
// 禁止页面滑动 function unScroll() {const width $(body).width();$(body).css(width, width px);$(body).css(overflow-y, hidden); }// 移除禁止页面滑动 function reUnScroll() {$(body).css(overflow-y, auto);$(body).css(width, ); }使用场景:鼠标局部滑…...
Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(七)
Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(七) 在 Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(六)-CSDN博客 的基础上改进,主要是…...
Halcon与C#:工业级机器视觉开发
Halcon(由MVTec开发)是一款广泛应用于工业机器视觉的高性能软件库,支持C#、C、Python等多种语言。以下是基于C#的Halcon开发详解,涵盖环境配置、核心流程、关键API及最佳实践。 1. 开发环境配置 1.1 安装Halcon …...
Unity序列化字段、单例模式(Singleton Pattern)
一、序列化字段 在Unity中,序列化字段是一个非常重要的概念,主要用于在Unity编辑器中显示和编辑类的成员变量,或者在运行时将对象的状态保存到文件或网络中。 1.Unity序列化字段的作用 在编辑器中显示和编辑字段:默认情况下&…...

【工具】Windows|外接的显示器怎么用软件调亮度(Brightness Slider)
文章目录 工具安装及使用Twinkle Tray:Brightness Slider补充背景知识1. DDC/CI(Display Data Channel Command Interface)2. WMI(Windows Management Instrumentation)3. Twinkle Tray如何结合两者?对比总…...
在 Java MyBatis 中遇到 “操作数类型冲突: varbinary 与 float 不兼容” 的解决方法
在 MyBatis 中遇到 “操作数类型冲突: varbinary 与 float 不兼容” 错误,通常是因为当字段值为 null 时,MyBatis 无法正确推断其 JDBC 类型,导致向数据库传递 null 值时类型不匹配。以下是原因分析和解决方案: 问题原因 未指定 j…...
系统架构设计(十四):解释器风格
概念 解释器风格是一种将程序的每个语句逐条读取并解释执行的体系结构风格。程序在运行时不会先被编译为机器码,而是动态地由解释器分析并执行其语义。 典型应用:Python 解释器、JavaScript 引擎、Bash Shell、SQL 引擎。 组成结构 解释器风格系统的…...

【Nextcloud】使用 LNMP 架构搭建私有云存储:Nextcloud 实战指南
目录 一、环境准备与基础配置 1. 系统环境要求 2. 初始化系统配置 二、搭建 LNMP 基础架构 1. 一键安装 LNMP 组件 2. 启动数据库服务 三、部署 Nextcloud 存储服务 1. 上传并解压安装包 2. 设置目录权限(测试环境配置) 3. 配置 MariaDB 数据库…...
VDC、SMC、MCU怎么协同工作的?
华为视频会议系统中,VDC(终端控制)、SMC(会话管理)、MCU(媒体处理) 通过分层协作实现端到端会议管理,其协同工作机制可总结为以下清晰架构: 1. 角色分工 组件核心职责类…...

【办公类-100-01】20250515手机导出教学照片,自动上传csdn+最小化Vscode界面
背景说明: 每次把教学照片上传csdn,都需要打开相册,一张张截图,然后ctrlV黏贴到CSDN内,我觉得太烦了。 改进思路: 是否可以先把所有照片都上传到csdn,然后再一张张的截图(去掉幼儿…...
Java-List集合类全面解析
Java-List集合类全面解析 前言一、List接口概述与核心特性1.1 List在集合框架中的位置1.2 List的核心特性1.3 常见实现类对比 二、ArrayList源码剖析与应用场景2.1 内部结构与初始化2.2 动态扩容机制2.3 性能特点与最佳实践 三、LinkedList 源码剖析与应用场景3.1 内部结构与节…...

uniapp-商城-60-后台 新增商品(属性的选中和页面显示,数组join 的使用)
前面添加了属性,添加属性的子级项目。也分析了如何回显,但是在添加新的商品的时,我们也同样需要进行选择,还要能正常的显示在界面上。下面对页面的显示进行分析。 1、界面情况回顾 属性显示其实是个一嵌套的数据显示。 2、选中的…...

[c语言日寄]数据结构:栈
【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…...

WEB安全--Java安全--LazyMap_CC1利用链
一、前言 该篇是基于WEB安全--Java安全--CC1利用链-CSDN博客的补充,上篇文章利用的是TransformedMap类,而CC链的原作者是利用的LazyMap类作为介质进行的触发。 所以本文将分析国外原作者在ysoserial commonscollections1中给出的CC1利用链。 二、回顾梳…...
【杂谈】-AI 重塑体育营销:从内容管理到创意释放的全面变革
AI 重塑体育营销:从内容管理到创意释放的全面变革 文章目录 AI 重塑体育营销:从内容管理到创意释放的全面变革1、加速从采集到推广的内容生命周期2、个性化粉丝体验3、以比赛速度分发体育内容4、让创作者在人工智能(AI)时代自由创…...

黑马k8s(六)
1.Deployment(Pod控制器) Selector runnginx 标签选择:会找pod打的标签 执行删除之后,pod也会删除,Terminating正在删除 如果想要访问其中的一个pod借助:IP地址端口号访问 假设在某一个瞬间,…...
【数据结构】二分查找(返回插入点)5.14
二分查找基础版 package 二分查找; public class BinarySearch { public static void main(String[] args) { // TODO Auto-generated method stub } public static int binarySearchBasic(int[] a,int target) { int i0,ja.length-1; //设置指针初值 while…...