【JavaWeb后端学习笔记】Mybatis基础操作以及动态SQL(增、删、改、查)
Mybatis
- 0、环境准备
- 0.1 准备数据库表emp;
- 0.2 准备SpringBoot工程
- 0.3 配置文件中引入数据库连接信息
- 0.4 创建对应的实体类
- 0.5 准备Mapper接口
- 1、MyBatis基础操作
- 1.1 删除
- 1.2 新增(主键返回)
- 1.3 更新
- 1.4 查询(解决字段名与类属性名不一致返回null问题)
- 2、动态SQL
- 2.1 XML映射文件
- 2.2 动态SQL标签
- 3、总结
0、环境准备
开始前需要做五个准备工作:
1.准备数据库表emp;
2.创建一个新的是SpringBoot工程,引入对应的起步依赖(Mybatis、MySQL、Lombok);
3.application.properties引入数据库连接信息(可改用yaml文件);
4.创建数据库表对应的实体类
5.准备Mapper接口
0.1 准备数据库表emp;
运行下面的SQL语句准备数据库数据:
-- 该案例来自黑马程序员
-- 部门管理
create table dept(id int unsigned primary key auto_increment comment '主键ID',name varchar(10) not null unique comment '部门名称',create_time datetime not null comment '创建时间',update_time datetime not null comment '修改时间'
) comment '部门表';insert into dept (id, name, create_time, update_time) values(1,'学工部',now(),now()),(2,'教研部',now(),now()),(3,'咨询部',now(),now()),(4,'就业部',now(),now()),(5,'人事部',now(),now());-- 员工管理
create table emp (id int unsigned primary key auto_increment comment 'ID',username varchar(20) not null unique comment '用户名',password varchar(32) default '123456' comment '密码',name varchar(10) not null comment '姓名',gender tinyint unsigned not null comment '性别, 说明: 1 男, 2 女',image varchar(300) comment '图像',job tinyint unsigned comment '职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师',entrydate date comment '入职时间',dept_id int unsigned comment '部门ID',create_time datetime not null comment '创建时间',update_time datetime not null comment '修改时间'
) comment '员工表';INSERT INTO emp
(id, username, password, name, gender, image, job, entrydate,dept_id, create_time, update_time) VALUES(1,'jinyong','123456','金庸',1,'1.jpg',4,'2000-01-01',2,now(),now()),(2,'zhangwuji','123456','张无忌',1,'2.jpg',2,'2015-01-01',2,now(),now()),(3,'yangxiao','123456','杨逍',1,'3.jpg',2,'2008-05-01',2,now(),now()),(4,'weiyixiao','123456','韦一笑',1,'4.jpg',2,'2007-01-01',2,now(),now()),(5,'changyuchun','123456','常遇春',1,'5.jpg',2,'2012-12-05',2,now(),now()),(6,'xiaozhao','123456','小昭',2,'6.jpg',3,'2013-09-05',1,now(),now()),(7,'jixiaofu','123456','纪晓芙',2,'7.jpg',1,'2005-08-01',1,now(),now()),(8,'zhouzhiruo','123456','周芷若',2,'8.jpg',1,'2014-11-09',1,now(),now()),(9,'dingminjun','123456','丁敏君',2,'9.jpg',1,'2011-03-11',1,now(),now()),(10,'zhaomin','123456','赵敏',2,'10.jpg',1,'2013-09-05',1,now(),now()),(11,'luzhangke','123456','鹿杖客',1,'11.jpg',5,'2007-02-01',3,now(),now()),(12,'hebiweng','123456','鹤笔翁',1,'12.jpg',5,'2008-08-18',3,now(),now()),(13,'fangdongbai','123456','方东白',1,'13.jpg',5,'2012-11-01',3,now(),now()),(14,'zhangsanfeng','123456','张三丰',1,'14.jpg',2,'2002-08-01',2,now(),now()),(15,'yulianzhou','123456','俞莲舟',1,'15.jpg',2,'2011-05-01',2,now(),now()),(16,'songyuanqiao','123456','宋远桥',1,'16.jpg',2,'2010-01-01',2,now(),now()),(17,'chenyouliang','123456','陈友谅',1,'17.jpg',NULL,'2015-03-21',NULL,now(),now());
0.2 准备SpringBoot工程
创建一个新的空工程。
创建一个SpringBoot项目模块。推荐将Server URL栏的https://start.spring.io替换成https://start.aliyun.com/
指定Mybatis、MySQL、Lombok所需依赖,并创建项目。
项目创建完成。
0.3 配置文件中引入数据库连接信息
在application.properties配置文件中配置MySQL数据库连接信息。
# 驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
# 连接数据库的用户名
spring.datasource.username=root
# 连接数据库的密码
spring.datasource.password=1234
这些信息可以从IDEA的可视化界面中查到。
下图中Database这一栏可以选择连接哪个数据库。
为了更方便后续调试,也可以配置MyBatis的日志输出配置。
# MyBatis日志配置
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
0.4 创建对应的实体类
创建实体类时需要注意成员变量与表的字段一一对应。
使用Lombok提供的注解生成构造方法以及get/set等方法。
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp {private Integer id;private String username;private String password;private String name;private Short gender;private String image;private Short job;private LocalDate entrydate;private Integer deptId;private LocalDateTime createTime;private LocalDateTime updateTime;
}
0.5 准备Mapper接口
Mapper接口需要加上@Mapper注解。程序在运行时,会自动创建代理对象,并交给IOC容器管理。
@Mapper
public interface EmpMapper {}
1、MyBatis基础操作
在Java服务端操作MySQL数据库需要用到MyBatis技术。相关代码通常放在DAO层,在使用MyBatis时习惯叫做Mapper层。对每一个MySQL的数据库表都要有一个相关的Mapper接口,里面定义操作该表对应的接口方法。在方法上通过注解的形式编写相应的SQL语句。
常用的注解有:
- @Select: 查
- @Delete: 删
- @Update: 改
- @Insert: 增
在使用这些注解编写SQL语句时,需要使用接口方法传来的参数,这时需要用到占位符。
占位符有:
#{ } :执行SQL时,会将 #{ } 替换为 ?,生成预编译SQL,会自动设置参数值,能够避免SQL注入风险;推荐使用。
$ { }:拼接SQL。直接将参数拼接在SQL语句中,存在SQL注入问题。
如果有多个参数,需要保证占位符中的变量名与接口方法形参名相同。推荐保持一致。
1.1 删除
根据ID删除数据。
定义一个接口deleteById(Integer id),接口中需要传入员工ID,使用Integer类型进行接收。
在接口方法上使用@Delete注解编写SQL语句,员工ID数据使用占位符替代。
/*** 根据ID删除数据* @param id*/
@Delete("delete from emp where id = #{id}")
void deleteById(Integer id);
在测试类中编写测试方法,调用deleteById()方法。
@SpringBootTest
class SpringbootMybatisApplicationTests {@Autowiredprivate EmpMapper empMapper;@Testpublic void testDelete(){// 删除ID为17的员工数据empMapper.deleteById(17);}
}
运行之后刷新emp表发现ID为17的员工被删除了。
MySQL中的delete、insert、update语句都有返回值,只要把接口的返回参数从void改成int即可,返回参数是SQL语句操作的数据条数。
1.2 新增(主键返回)
新增员工数据。
定义一个新增数据接口insert(Emp emp),接口中传入一个实体类对象,对象中包含要插入的字段数据。
在接口方法上使用@Insert注解编写SQL语句。接口传入的是一个实体类对象,因此在SQL语句占位符中需要填入对象的属性名,也就是类的成员变量名。
/*** 新增员工数据* @param emp*/
@Insert("insert into emp (username, name, gender, image, job, entrydate, dept_id, create_time, update_time) " +"values (#{username}, #{name}, #{gender}, #{image}, #{job}, #{entrydate}, #{deptId}, #{createTime}, #{updateTime})")
void insert(Emp emp);
在测试类中编写测试方法,调用insert()方法。
@Test
public void testInsert() {// 准备一个emp对象Emp emp = new Emp();emp.setUsername("xiaowang");emp.setName("小王");emp.setGender((short)1);emp.setImage("1.jpg");emp.setJob((short)1);emp.setEntrydate(LocalDate.of(2020, 12,2));emp.setDeptId(1);emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());// 使用empMapper调用insert()方法empMapper.insert(emp);// 查看主键IDSystem.out.println(emp.getId()); // 控制台输出:null
}
运行之后刷新emp表,发现插入了一条数据。
主键返回:
在某些业务场景下,需要获取刚插入的数据的主键ID。如果仅仅使用上面编写的代码是获取不到的。这时只需要在接口方法上再加上一个@Options注解,设置useGeneratedKeys = true,表明需要返回主键,设置keyProperty = “id”,表明将主键值绑定在成员变量 “id” 上。
/*** 新增员工数据* @param emp*/
@Options(keyProperty = "id", useGeneratedKeys = true) // 获取返回的主键
@Insert("insert into emp (username, name, gender, image, job, entrydate, dept_id, create_time, update_time) " +
"values (#{username}, #{name}, #{gender}, #{image}, #{job}, #{entrydate}, #{deptId}, #{createTime}, #{updateTime})")
void insert(Emp emp);
1.3 更新
更新员工信息。
定义一个根据ID更新的接口方法updateById(Emp emp),在方法中传入一个Emp对象,对象中包含修改后的数据。
在接口方法上使用@Update注解编写SQL语句。接口传入的是一个实体类对象,因此在SQL语句占位符中需要填入对象的属性名,也就是类的成员变量名。
/*** 更新员工信息* @param emp*/
@Update("update emp set username = #{username}, name = #{name}, gender = #{gender}, image = #{image}, job = #{job}, " +"entrydate = #{entrydate}, dept_id = #{deptId}, update_time = #{updateTime} where id = #{id}")
void updateById(Emp emp);
在测试类中编写测试方法,调用updateById()方法。
@Test
public void testUpdate() {// 准备一个emp对象Emp emp = new Emp();emp.setId(21);emp.setUsername("xiaowang");emp.setName("小王");emp.setGender((short)1);emp.setImage("21.jpg");emp.setJob((short)1);emp.setEntrydate(LocalDate.of(2022, 12,2));emp.setDeptId(2);emp.setUpdateTime(LocalDateTime.now());// 使用empMapper调用updateById()方法empMapper.updateById(emp);
}
运行之后刷新emp表,发现ID为21的员工数据被修改了。
1.4 查询(解决字段名与类属性名不一致返回null问题)
查询操作是使用最多的操作,有根据单个字段的简单查询和复杂条件的复杂查询。
首先尝试实现根据ID字段的简单查询。
定义一个getById(Integet id)方法,接口中传入要查询的员工ID,返回一个Emp员工对象。
在接口方法上使用@Select注解编写SQL语句,形参变量名与占位符中变量名相同。
MyBatis会将查询到的数据自动封装到Emp对象的属性中。
/*** 根据ID查询员工信息* @param id* @return*/
@Select("select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time from emp where id = #{id}")
Emp getById(Integer id);
在测试类中编写测试方法,调用getById()方法。
@Test
public void testGetById() {// 查询ID为1的员工信息Emp emp = empMapper.getById(1);System.out.println(emp);
}
// 输出结果:
// Emp(id=1, username=jinyong, password=123456, name=金庸, gender=1, image=1.jpg, job=4, entrydate=2000-01-01, deptId=null, createTime=null, updateTime=null)
需要注意:表的字段名与类的成员变量名不同,查询到的结果为null。
可以发现输出结果中,deptId,createTime,updateTime这三个属性的值为null。这是因为表中的字段名与类的成员变量名不同造成的。MySQL中表的字段名习惯使用下划线 _ 分隔,Java中成员变量习惯使用驼峰命名法。解决方法有三种。
- 第一种:
在配置文件中开启MyBatis的驼峰命名自动映射开关。(推荐使用)
# 开启MyBatis的驼峰命名自动映射开关
mybatis.configuration.map-underscore-to-camel-case=true
- 第二种:
给查询字段起别名,别名与类的成员变量名一致。
/*** 根据ID查询员工信息* @param id* @return*/
@Select("select id, username, password, name, gender, image, job, entrydate, " +"dept_id deptId, create_time createTime, update_time updateTime from emp where id = #{id}")
Emp getById(Integer id);
- 第三种:
使用@Results注解和@Result注解。
/*** 根据ID查询员工信息* @param id* @return*/
@Results({@Result(column = "dept_id", property = "deptId"),@Result(column = "create_time", property = "createTime"),@Result(column = "update_time", property = "updateTime")
})
@Select("select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time from emp where id = #{id}")
Emp getById(Integer id);
现在尝试复杂条件查询。
查询满足指定的姓氏、性别、入职时间范围内的员工。
定义一个list接口,编写SQL语句。在某些Spring版本中,当接口参数有多个时,接口参数前需要加@Param注解绑定参数,不然会报错。
从下面的SQL语句中可以看到,name字段使用了like模糊查询,匹配的字符串使用了concat()函数,这是MySQL提供的字符串拼接函数。
@Select("select * from emp where name like concat('%',#{name},'%') and gender = #{gender} and " +"entrydate between #{begin} and #{end} order by update_time desc")
List<Emp> list(@Param("name")String name, @Param("gender")Short gender,@Param("begin")LocalDate begin, @Param("end")LocalDate end);
在测试类中编写测试方法,调用list()方法进行测试。
@Test
public void testList() {List<Emp> emps = empMapper.list("张", (short) 1, LocalDate.of(2010, 1, 1), LocalDate.of(2020, 1, 1));System.out.println(emps);
}
2、动态SQL
2.1 XML映射文件
XML映射文件规范:
- XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名);
- XML映射文件的namespace属性为Mapper接口全限定名一致;
- XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。
创建和使用XML映射文件的步骤:
- 在resources文件夹下创建与Mapper接口所在包相同的包。注意创建多级包时,文件夹路径使用下划线分隔。
- 创建与Mapper接口同名的.xml文件。
- 在XML映射文件中引入MyBatis约束。不需要记忆,用到的时候到MyBatis官方文档中查找。约束如下:
<?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接口文件中定义一个接口。例如将1.4节中的list()接口方法通过XML映射形式实现:
List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);
- 在XML映射文件中实现该接口的SQL语句。
注意XML映射文件的namespace属性为Mapper接口全限定名一致;全限定名可以通过选中Mapper接口名点击右键,在点击Copy Reference获取。
同时,XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。
下面这段代码中有一点需要注意。动态SQL中比较大小需要使用<![CDATA[ >= ]]>替换。
<mapper namespace="com.wrj.mapper.EmpMapper"><select id="list" resultType="com.wrj.pojo.Emp">select * from emp<where><if test="name != null and name != ''">name like concat('%', #{name}, '%') and</if><if test="gender != null">gender = #{gender} and</if><if test="begin != null">entrydate <![CDATA[ >= ]]> #{begin} and</if><if test="end != null">entrydate <![CDATA[ <= ]]> #{end}</if></where>order by update_time desc</select>
</mapper>
2.2 动态SQL标签
if标签:用于判断条件是否成立。使用 test 属性进行条件判断,如果条件为 true ,则拼接 SQL。
范例:
<if test="name != null and name != ''">name like concat('%', #{name}, '%') and</if>
where标签:如果where标签对中的条件都不成立,则不生成 where 关键字。如果 where 标签对中有多于的 and 或 or ,则删去多于的 and 和 or 。
范例:
<where><if test="name != null and name != ''">name like concat('%', #{name}, '%') and</if><if test="gender != null">gender = #{gender} and</if><if test="begin != null">entrydate <![CDATA[ >= ]]> #{begin} and</if><if test="end != null">entrydate <![CDATA[ <= ]]> #{end}</if>
</where>
set标签:在更新数据(update语句中)时,set 标签对可以动态删除包裹的 if 标签对中多于的逗号。
范例:
<set><if test="username != null">username = #{username},</if><if test="name != null">name = #{name},</if><if test="gender != null">gender = #{gender},</if><if test="updateTime != null">update_time = #{updateTime}</if>
</set>
foreach标签:遍历。批量操作时使用。
foreach常用属性:collection:遍历的集合;item:遍历出来的元素;separator:分隔符;open:遍历开始前拼接的SQL片段;close:遍历结束后拼接的SQL片段。
范例:根据id遍历删除批量数据
<delete id="deleteByIds">delete from emp where id in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach>
</delete>
sql标签与include标签:sql标签抽取代码,include标签调用抽取的代码。sql与include成对使用。
范例:
# <sql></sql>标签对抽取代码,方便复用
<sql id="commonSelect">select id, username,name,gender from emp
</sql><select id="list" resultType="com.wurongjiang.pojo.Emp"># <include></include>标签引用<sql></sql>标签抽取的代码。<include refid="commonSelect"/><where><if test="name != null"> name like concat('%',#{name},'%') </if><if test="gender != null"> and gender = #{gender} </if></where>
</select>
3、总结
- 在新建SpringBoot项目时,将Server URL栏的https://start.spring.io替换成https://start.aliyun.com/
- 在配置文件配置MyBatis时,可以添加日志配置和自动驼峰命名转换配置。
# MyBatis日志配置
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
# 开启自动驼峰命名转换
mybatis.configuration.map-underscore-to-camel-case=true
- MyBatis常用的编写SQL语句的四个注解@Select、@Delete、@Update、@Insert。
- SQL语句中的占位符,#{…}:执行SQL时,会将 #{ } 替换为 ?,生成预编译SQL,会自动设置参数值,能够避免SQL注入风险;${…}:拼接SQL。直接将参数拼接在SQL语句中,存在SQL注入问题。。
- @Delete、@Update、@Insert定义的接口都具有返回值。需要返回值时将返回类型修改成int,返回值为该条SQL语句操作的数据条数。
- 主键返回需要在接口方法上再加上一个@Options注解,设置useGeneratedKeys属性和keyProperty属性。动态SQL需要在insert标签对中设置useGeneratedKeys属性和keyProperty属性。
- MySQL提供的concat()函数能够拼接字符串。在模糊匹配时,推荐使用。
@Select("select * from emp where name like concat('%',#{name},'%') and gender = #{gender} and " +"entrydate between #{begin} and #{end} order by update_time desc")
List<Emp> list(@Param("name")String name, @Param("gender")Short gender,@Param("begin")LocalDate begin, @Param("end")LocalDate end);
- 动态SQL中比较大小需要使用<![CDATA[ >= ]]>替换。
相关文章:

【JavaWeb后端学习笔记】Mybatis基础操作以及动态SQL(增、删、改、查)
Mybatis 0、环境准备0.1 准备数据库表emp;0.2 准备SpringBoot工程0.3 配置文件中引入数据库连接信息0.4 创建对应的实体类0.5 准备Mapper接口 1、MyBatis基础操作1.1 删除1.2 新增(主键返回)1.3 更新1.4 查询(解决字段名与类属性名…...

基于MATLAB野外观测站生态气象数据处理分析实践应用
1.本课程基于MATLAB语言 2.以实践案例为主,提供所有代码 3.原理与操作结合 4.布置作业,答疑与拓展 示意图: 以野外观测站高频时序生态气象数据为例,基于MATLAB开展上机操作: 1.不同生态气象要素文件的数据读写与批处理…...

IP 地理位置定位技术原理概述
本文深入探讨 IP 地理位置定位技术的原理。介绍了 IP 地址的基本概念及其在网络中的作用,随后阐述了基于数据库查询、基于网络拓扑分析以及基于机器学习算法的三种主要 IP 地理位置定位技术原理中的基于IP数据库查询。 IP 地址基础 IP 地址是互联网协议࿰…...

C语言(分支结构)
问题引出 我们在程序设计往往会遇到如下的问题,比如下的函数的计算。 也就是我们是必须要通过一个条件的结果来选择下一步的操作,算法上属于一个分支结构,C语言中实现分支结构主要使用if语句。 条件判断 根据某个条件成立与否,…...

批量将不同的工作簿合并到同一个Excel文件
批量将不同的工作簿合并到同一个Excel文件 下面是一个示例,展示如何批量将不同的工作簿合并到同一个Excel文件,并生成模拟数据。我们将使用 Python 的 pandas 库来完成这个任务。具体步骤如下: 步骤 1: 安装必要的库 首先确保你已安装 pan…...

详解AI网关助力配电房实现智能化管控应用
对于一些建设年份久远的老旧配电房,由于配套降温散热设施设备不完善、线路设备老化等因素,极易出现因环境过热而影响设备正常稳定运行,进而导致电气故障甚至火灾等事故产生。 基于AI网关的配电房智能监控及管理 针对配电房的实时安全监测及…...

2025美赛数学建模常用数据库网站大全
优秀模板写作红宝书数学模型获取——更多资料请点击下方名片进群获取。 一、可以查询美国各个领域经济指标的网站: olap.epsnet.com.cnhttps://www.ers.usda.gov/data-products/rice-yearbook/www.ers.usda.govU.S. Energy Information Administration (EIA) www.eia.govhttp…...

Wordpress设置固定链接形式后出现404错误
比如固定连接设置为 /archives/%post_id%.html 这种形式,看起来比较舒服。对搜索引擎也友好。 出现404需要设置伪静态...

我最近在干什么【1】
前言 打算开一个新系列,偏休闲点的,不是完整全面的技术分享,话题还是聚焦个人成长(学的技术、了解到的信息、看的书……) 方面。文章偏意识流点,单纯分享我最近在干什么,不定期更新,…...

[Vue3]computed原理
Computed原理 不管在是 Vue 2 还是在 Vue 3 中,对 computed 本身的实现原理基本都是一样的。当使用 computed 计算属性时,组件初始化会对每一个计算属性都创建对应的 watcher , 然后在第一次调用自己的 getter 方法时,收集计算属性依赖的所有…...

Vue工程化开发中各文件的作用
1.main.js文件 main.js文件的主要作用:导入App.vue,基于App.vue创建结构渲染index.html。...

【c++笔试强训】(第三十一篇)
目录 最⻓回⽂⼦序列(动态规划-区间dp) 题目解析 讲解算法原理 编写代码 添加字符(字符串) 题目解析 讲解算法原理 编写代码 最⻓回⽂⼦序列(动态规划-区间dp) 题目解析 1.题目链接:最…...

Go 1.19.4 HTTP编程-Day 20
1. HTTP协议 1.1 基本介绍 HTTP协议又称超文本传输协议,属于应用层协议,在传输层使用TCP协议。HTTP协议属是无状态的,对事务处理没有记忆能力,如果需要保存状态需要引用其他技术,如Cookie。HTTP协议属是无连接的&…...

MySQL 8.0 的主主复制(双向复制)
在 Windows Server 2022 Datacenter 上配置 MySQL 8.0 的主主复制(双向复制),步骤与 Linux 类似,但有一些特定的配置和路径需要注意。以下是详细的简化步骤: 1. 使用 root 用户登录 确保你以 root 用户登录到 MySQL …...

四、自然语言处理_03LSTM与GRU
0、前言 随着循环神经网络(RNN)在各种序列数据处理任务中被广泛应用,研究人员逐渐发现了其在处理长序列数据时会容易出现梯度消失(vanishing gradient)和梯度爆炸(exploding gradient)问题&…...

磁盘系列基础知识(一):硬盘;IDE;ATA;SATA;AHCI;SCSI;SAS
磁盘系列基础知识(一)硬盘 IDE ATA SATA AHCI SCSI SAS 硬盘厂家 西部数据Western Digital/WD. 希捷 SEAGATE、三星 SAMSUNG、东之 Toshiba、英特尔 Intel、金士顿 Kingston、闪迪 SanDisk、 英睿达 Crucial、浦科特 Plextor 硬盘类别 HDD (…...

taro小程序进入腾讯验证码
接入原因 昨天突然晚上有人刷我们公司的登录发送短信接口,紧急将小程序的验证码校验更新上去了 接下来就是我们的接入方法,其实很简单,不过有时候可能大家着急就没有仔细看文档,腾讯验证码文档微信小程序地址,注意这里…...

原子类相关
原子引用 JUC 并发包提供了: AtomicReferenceAtomicMarkableReferenceAtomicStampedReference AtomicReference 使用举例 public interface DecimalAccount {// 获取余额BigDecimal getBalance();// 取款void withdraw(BigDecimal amount);/*** 方法内会启动 10…...

RabbitMQ 客户端 连接、发送、接收处理消息
RabbitMQ 客户端 连接、发送、接收处理消息 一. RabbitMQ 的机制跟 Tcp、Udp、Http 这种还不太一样 RabbitMQ 服务,不是像其他服务器一样,负责逻辑处理,然后转发给客户端 而是所有客户端想要向 RabbitMQ服务发送消息, 第一步&a…...

Java Web 3 Axios Vue组件库
一 Ajax 1 同步 异步 2 原生Ajax 比较繁琐 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Documen…...

双目相机的标定,视差图,深度图,点云生成思路与实现。
该文档记录从双目相机标定到点云生成的所有过程,同时会附上代码。 代码直接能跑。https://github.com/stu-yzZ/stereoCamera 目录 大致思路如下: 一、相机标定 1、相机参数介绍 2、单目相机标定 3、双目相机标定 二、图片畸变矫正 三、极线矫正…...

【H2O2|全栈】MySQL的基本操作(三)
目录 前言 开篇语 准备工作 案例准备 多表查询 笛卡尔积 等值连接 外连接 内连接 自连接 子查询 存在和所有 含于 分页查询 建表语句 结束语 前言 开篇语 本篇继续讲解MySQL的一些基础的操作——数据字段的查询中的多表查询和分页查询,与单表查询…...

2、C++命名空间
命名空间 命名空间是一种用来避免命名冲突的机制; 原理是将一个全局的作用域分成一个个命名空间,每个命名空间是个单独的作用域,从而有效避免命名冲突。 注意:命名空间定义在全局 命名空间定义格式 使用: …...

Elemenu-UI时间日期单个组件,限制当前日期之后的时间
element的时间日期组件, type"datetime" ,当你设置了:picker-options"pickerOptions"之后 pickerOptions: { disabledDate(time) { return time.getTime() > Date.now(); }, }, 会发现,他只会限制日期,但不…...

flutter修改状态栏学习
在flutter中如何动态更改状态栏的颜色和风格。 前置知识点学习 AnnotatedRegion AnnotatedRegion 是 Flutter 中的一个小部件,用于在特定区域中提供元数据(metadata)以影响某些系统级的行为或外观。它通常用于改变系统 UI 的外观ÿ…...

解决Unity编辑器Inspector视图中文注释乱码
1.问题介绍 新创建一个脚本,用VS打开编辑,增加一行中文注释保存,在Unity中找到该脚本并选中,Inspector视图中预览的显示内容,该中文注释显示为乱码,如下图所示: 2.图示解决步骤 按上述步骤操作…...

关于csgo的游戏作弊与封禁
关于csgo的游戏作弊与封禁 一.关于作弊 什么叫作弊? 1.换肤,换库存 2.各种参(回溯,自瞄,透视,急停,连跳,假身,子弹跟踪等) 3.某一部分更改游戏内存&…...

严格单元测试造就安全软件
在信息技术迅速发展的今天,软件在各个行业中扮演着至关重要的角色,尤其是在汽车行业,其中软件的可靠性和安全性直接影响到人们的生命安全。软件缺陷所带来的潜在风险不容小觑,尤其在涉及到自动驾驶和车辆控制等关键系统时…...

ubuntu 根分区逻辑卷扩容
1、虚拟机关机通过管理界面给磁盘扩容。 rootcurtis:/home/curtis/git_code# pvdisplay--- Physical volume ---PV Name /dev/vda3VG Name ubuntu-vgPV Size <239.00 GiB / not usable 0Allocatable yes (but full)PE…...

如何查看电脑生产日期
查看电脑的生产日期通常可以通过以下方法实现,具体方式取决于操作系统和电脑类型: 方法 1:检查电脑 BIOS 生产日期通常记录在 BIOS 中。可以通过以下步骤查看: 重启电脑并进入 BIOS: 启动时按下特定的键(…...