MyBaits注解开发

1、注解开发介绍

在过去使用框架开发项目,基本都采用xml作为框架的核心配置文件存在,但是这种方式开发效率还是比较地下、不灵活。

现在企业开发为了能够更快的提高开发效率,必然会使用企业级框架进行项目开发,而现在主流的框架都支持基于注解的方式开发项目。

mybatis框架已经全面支持基于注解的开发。

使用mybatis的注解开发,并不能省略mybatis的核心配置文件,而注解仅仅只是代替Mapper文件

MyBatis 的注解开发主要代替了以下功能:

  1. 替代映射器接口(Mapper XML)
  • 使用@Mapper标注接口为映射器接口
  • 使用@Select、@Update等注解写SQL语句
  1. 替代结果映射(ResultMap)
  • 使用@Results和@Result注解配置结果映射
  1. 替代字段与属性映射
  • 使用@Column注解指定数据库列名
  • 使用@Id注解指定主键字段
  1. 替代关联查询
  • 使用@One、@Many注解配置一对一、一对多关系
  1. 替代动态SQL
  • 使用@SelectProvider、@UpdateProvider等注解执行动态SQL
  1. 替代缓存配置
  • 使用@CacheNamespace、@CacheFlush等注解配置缓存

注解开发使配置更简单,直接在接口及字段上通过注解即可实现XML方式的大部分功能。

但注解方式有限制。比如复杂的结果映射、动态SQL等还是建议用XML方式配置。所以在复杂场景下,注解+XML配置可以发挥两者优势。

2、Mybatis注解开发

mybatis注解开发主要介绍:

1、 注解开发的环境搭建

2、 单表的CRUD操作(使用代理方式)

3、 多表查询操作

4、 缓存的配置

2.1、注解开发环境搭建

2.1.1、创建maven项目

选择File > New > Project ,进入创建界面
请添加图片描述
选择New Project ,右侧填写项目名,选择项目存储路径,选择语言,构建工具,jdk版本,maven高级设置:
请添加图片描述

2.1.2、maven的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.qbzaixian</groupId><artifactId>qbzaixian</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.13</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.34</version></dependency><!-- lombok简化实体类开发,需要idea安装lombok的插件哦~~~--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.8</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies>
</project>

2.1.3、书写mybatis的核心配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--  properties 引入外部的配置文件,必须使用resource属性  --><properties resource="db.properties"/><!--settings 标签 --><settings><!-- 设置mybatis 的缓存--><setting name="cacheEnabled" value="true"/><!-- 开启驼峰式命名规则--><setting name="mapUnderscoreToCamelCase" value="true"/></settings><!-- 设置别名 --><typeAliases><package name="com.qbzaixian.pojo"/></typeAliases><environments default="mysql"><environment id="mysql"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}" /><property name="url" value="${url}" /><property name="username" value="${username}" /><property name="password" value="${password}" /></dataSource></environment></environments><mappers><!-- 这里必须采用包的方式配置,因为没有mapper文件,书写接口所在的包--><package name="com.qbzaixian.mapper"/></mappers>
</configuration>

2.1.4、创建数据库

-- 创建数据库
CREATE DATABASE mybatis;
USE mybatis;
DROP TABLE IF EXISTS `tb_item`;
-- 创建商品表
CREATE TABLE `tb_item` (`id` INT(11) NOT NULL AUTO_INCREMENT,`item_name` VARCHAR(32) NOT NULL COMMENT '商品名称',`item_price` FLOAT(6,1) NOT NULL COMMENT '商品价格',`item_detail` TEXT COMMENT '商品描述',PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;INSERT INTO `tb_item` VALUES ('1', 'iPhone 6', '5288.0', '苹果公司新发布的手机产品。');
INSERT INTO `tb_item` VALUES ('2', 'iPhone 6 plus', '6288.0', '苹果公司发布的新大屏手机。');-- 创建用户表DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT,`user_name` VARCHAR(100) DEFAULT NULL COMMENT '用户名',`password` VARCHAR(100) DEFAULT NULL COMMENT '密码',`name` VARCHAR(100) DEFAULT NULL COMMENT '姓名',`age` INT(10) DEFAULT NULL COMMENT '年龄',`sex` TINYINT(1) DEFAULT NULL COMMENT '性别,1男性,2女性',`birthday` DATE DEFAULT NULL COMMENT '出生日期',`created` DATETIME DEFAULT NULL COMMENT '创建时间',`updated` DATETIME DEFAULT NULL COMMENT '更新时间',PRIMARY KEY (`id`),UNIQUE KEY `username` (`user_name`)
) ENGINE=INNODB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;INSERT INTO `tb_user` VALUES ('1', 'zhangsan', '123456', '张三', '30', '1', '1984-08-08', '2022-09-19 16:56:04', '2022-09-21 11:24:59');
INSERT INTO `tb_user` VALUES ('2', 'lisi', '123456', '李四', '21', '2', '1991-01-01', '2022-09-19 16:56:04', '2022-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('3', 'wangwu', '123456', '王五', '22', '2', '1989-01-01', '2022-09-19 16:56:04', '2022-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('4', 'zhangwei', '123456', '张伟', '20', '1', '1988-09-01', '2022-09-19 16:56:04', '2022-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('5', 'lina', '123456', '李娜', '28', '1', '1985-01-01', '2022-09-19 16:56:04', '2022-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('6', 'lilei', '123456', '李磊', '23', '1', '1988-08-08', '2022-09-20 11:41:15', '2022-09-20 11:41:15');-- 订单表
DROP TABLE IF EXISTS `tb_order`;
CREATE TABLE `tb_order` (`id` INT(11) NOT NULL AUTO_INCREMENT,`user_id` BIGINT(20) NOT NULL,`order_number` VARCHAR(20) NOT NULL COMMENT '订单号',PRIMARY KEY (`id`),KEY `FK_orders_1` (`user_id`),CONSTRAINT `FK_orders_1` FOREIGN KEY (`user_id`) REFERENCES `tb_user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;INSERT INTO `tb_order` VALUES ('1', '1', '20220921001');
INSERT INTO `tb_order` VALUES ('2', '2', '20220921002');
INSERT INTO `tb_order` VALUES ('3', '1', '20220921003');-- 创建订单明细表DROP TABLE IF EXISTS `tb_orderdetail`;
CREATE TABLE `tb_orderdetail` (`id` INT(11) NOT NULL AUTO_INCREMENT,`order_id` INT(32) DEFAULT NULL COMMENT '订单号',`item_id` INT(32) DEFAULT NULL COMMENT '商品id',`total_price` DOUBLE(20,0) DEFAULT NULL COMMENT '商品总价',`status` INT(11) DEFAULT NULL COMMENT '状态',PRIMARY KEY (`id`),KEY `FK_orderdetail_1` (`order_id`),KEY `FK_orderdetail_2` (`item_id`),CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`order_id`) REFERENCES `tb_order` (`id`),CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`item_id`) REFERENCES `tb_item` (`id`)
) ENGINE=INNODB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;INSERT INTO `tb_orderdetail` VALUES ('1', '1', '1', '5288', '1');
INSERT INTO `tb_orderdetail` VALUES ('2', '1', '2', '6288', '1');
INSERT INTO `tb_orderdetail` VALUES ('3', '2', '2', '6288', '1');
INSERT INTO `tb_orderdetail` VALUES ('4', '3', '1', '5288', '1');

2.2、注解开发快速入门

2.2.1、编写pojo类

@Data
public class User {private Long id;// 用户名private String userName;// 密码private String password;// 姓名private String name;// 年龄private Integer age;// 性别,1男性,2女性private Integer sex;// 出生日期private Date birthday;// 创建时间private Date created;// 更新时间private Date updated;
}

2.2.2、编写接口

/*** MyBaits的注解开发*/
public interface UserMapper {@Select("select * from tb_user where id = #{id}")public User selectById(Integer id);
}

2.2.3、编写测试类

public class MyBatisTest {private SqlSessionFactory factory;@Beforepublic void init() throws Exception {//1、获取配置文件InputStream in = Resources.getResourceAsStream("mybatis-config.xml");factory = new SqlSessionFactoryBuilder().build(in);}@Testpublic void testFindUserById(){SqlSession session = factory.openSession(true);UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.selectById(1);System.out.println(user);}
}

3、注解开发CRUD

mybatis注解开发主要使用的注解有:

  • @Select:完成查询sql语句的编写
  • @Update:完成修改的SQL语句编写
  • @Delete:完成删除的SQL语句编写
  • @Insert:完成插入的SQL语句编写

3.1、@Select注解

@Select:标记在方法上,表示该方法对应的SQL是查询语句。

public interface UserMapper {@Select("select * from tb_user where id = #{id}")public User selectById(Integer id);@Select("select * from tb_user")public List<User> selectUsers();
}
@Test
public void testFindUserById(){SqlSession session = factory.openSession(true);UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.selectById(1);System.out.println(user);System.out.println("--------------------");List<User> users = mapper.selectUsers();users.forEach(System.out::println);
}

3.2、@Update注解

@Update:表示该方法对应的SQL是更新语句。

@Update("update tb_user set age = #{age} , user_name = #{userName} WHERE id = #{id}")
public void updateUser(User user);
@Test
public void testUpdate(){SqlSession session = factory.openSession(true);UserMapper mapper = session.getMapper(UserMapper.class);User user = new User();user.setAge(30);user.setUserName("小羊苏西");user.setId(3L);mapper.updateUser(user);
}

3.3、@Delete注解

@Delete:表示该方法对应的SQL是删除语句。

@Delete("delete from tb_user where id = #{id}")
public void deleteById(Integer id);
@Test
public void testDelete(){SqlSession session = factory.openSession(true);UserMapper mapper = session.getMapper(UserMapper.class);mapper.deleteById(6);
}

3.4、@Insert注解

@Insert:表示该方法对应的SQL是插入语句。

@Insert("insert into tb_user(user_name,name,age,password,sex) values(#{userName},#{name},#{age},#{password},#{sex})")
public void addUser(User user);
@Test
public void testInsert(){SqlSession session = factory.openSession(true);UserMapper mapper = session.getMapper(UserMapper.class);User user = new User();user.setName("zwj");user.setUserName("张无忌");user.setAge(20);user.setPassword("123123");user.setSex(1);mapper.addUser(user);
}

4、@Results注解

Results注解主要完成在查询的时候列名和pojo的属性不对应时的映射操作的(类似于Mapper文件中使用resultMap进行配置解决),为了演示这个问题,这里故意修改pojo中的属性与列名不一致。

@Data
public class User2 {private Long id;// 用户名:故意修改userName为uName,方便下面测试private String uName;// 密码:故意修改password为pwd,方便下面测试private String pwd;// 姓名private String name;// 年龄private Integer age;// 性别,1男性,2女性private Integer sex;// 出生日期private Date birthday;// 创建时间private Date created;// 更新时间private Date updated;
}

为了方便,测试,这里在上面演示的CRUD中,对口和测试都是直接复制,在接口和类名后面添加了数字2.

public interface UserMapper2 {@Select("select * from tb_user where id = #{id}")public User2 selectById(Integer id);@Select("select * from tb_user")public List<User2> selectUsers();
}
public class MyBatisTest2 {private SqlSessionFactory factory;@Beforepublic void init() throws Exception {//1、获取配置文件InputStream in = Resources.getResourceAsStream("mybatis-config.xml");factory = new SqlSessionFactoryBuilder().build(in);}@Testpublic void testFindUserById(){SqlSession session = factory.openSession(true);UserMapper2 mapper = session.getMapper(UserMapper2.class);User2 user = mapper.selectById(1);System.out.println(user);}
}

查看打印的执行结果:

User2(id=1, uName=null, pwd=null, name=张三, age=30, sex=1, birthday=Wed Aug 08 00:00:00 CST 1984, created=Mon Sep 19 16:56:04 CST 2022, updated=Wed Sep 21 11:24:59 CST 2022)

注意,uName和pwd并没有封装到数据,因为pojo的属性名和列名不对应。无法自动封装。

mybatis提供Results注解解决这个问题

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Results {/*** Returns the id of this result map.** @return the id of this result map*/String id() default "";/*** Returns mapping definitions for property.** @return mapping definitions*/Result[] value() default {};
}

其中的id,是给当前这个Results注解起名字,方便在别的地方引用。

其中的Result用来书写具体的列名和属性名的对应关系。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Repeatable(Results.class)
public @interface Result {/*** Returns whether id column or not.** @return {@code true} if id column; {@code false} if otherwise*/boolean id() default false;/*** Return the column name(or column label) to map to this argument.** @return the column name(or column label)*/String column() default "";/*** Returns the property name for applying this mapping.** @return the property name*/String property() default "";/*** Return the java type for this argument.** @return the java type*/Class<?> javaType() default void.class;/*** Return the jdbc type for column that map to this argument.** @return the jdbc type*/JdbcType jdbcType() default JdbcType.UNDEFINED;/*** Returns the {@link TypeHandler} type for retrieving a column value from result set.** @return the {@link TypeHandler} type*/Class<? extends TypeHandler> typeHandler() default UnknownTypeHandler.class;/*** Returns the mapping definition for single relationship.** @return the mapping definition for single relationship*/One one() default @One;/*** Returns the mapping definition for collection relationship.** @return the mapping definition for collection relationship*/Many many() default @Many;
}

Result注解中常用的几个属性解释:

id:当前的列是否为主键

column:对应数据库中的列名

property:对应pojo中的属性名

javaType:对应的属性名的数据类型

jdbcType:对应的数据库列类型

public interface UserMapper2 {@Select("select * from tb_user where id = #{id}")@Results(id = "uDemo",value = {@Result(column = "user_name",property = "uName",id = false),@Result(column = "password",property = "pwd",id = false),})public User2 selectById(Integer id);@Select("select * from tb_user")public List<User2> selectUsers();
}

重新执行测试,会发现对应的属性已经可以自动封装数据

User2(id=1, uName=zhangsan, pwd=123456, name=张三, age=30, sex=1, birthday=Wed Aug 08 00:00:00 CST 1984, created=Mon Sep 19 16:56:04 CST 2022, updated=Wed Sep 21 11:24:59 CST 2022)

在接口中,如果某个方法上已经使用Results定义好映射关系,别的方法上也需要相同的映射关系,可以使用ResultMap注解引用(前提是Results注解必须使用id属性给其命名)

public interface UserMapper2 {@Select("select * from tb_user where id = #{id}")@Results(id = "uDemo",value = {@Result(column = "user_name",property = "uName",id = false),@Result(column = "password",property = "pwd",id = false),})public User2 selectById(Integer id);@Select("select * from tb_user")// 引用上面已经定义好的结果集映射处理注解Results@ResultMap(value="uDemo")public List<User2> selectUsers();
}

5、多表操作

实体类

@Data
public class Order {private Integer id;private Long userId;private String orderNumber;// 添加用户引用private User user;// 添加订单明细引用(一个订单对应多个明细,需要使用集合来封装)private List<Orderdetail> orderdetails;
}
@Data
public class Orderdetail {private Integer id;private Double totalPrice;private Integer status;// 一个订单明细对应一个商品private Item item;
}
@Data
public class Item {private Integer id;private String itemname;private Float itemprice;private String itemdetail;
}

5.1、注解一对一

演示通过订单明细查询对应的商品,订单明细和商品之间是一对一的关系。

在mybatis提供的@Result注解中有:one和many属性,用于完成多表操作注解映射关系配置

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Repeatable(Results.class)
public @interface Result {// 其他的在上面已经解释过,这里删除省略了...........One one() default @One;Many many() default @Many;
}
  • one属性表示的一对一的映射配置
  • many属性表示一对多的映射配置
public interface OrderdetailMapper {/*** 通过订单明细查询对应的商品,订单明细和商品之间是一对一的关系* 接收订单明细的id*/// 主查询:根据订单明细的id查询订单明细,但由于订单明细中关联对应的商品信息// 需要使用@Results注解配置关联商品信息映射关系@Select("select * from tb_orderdetail where id = #{id}")// 配置关联查询@Results(value = {// 配置id属性@Result(column = "id",property = "id",id = true),@Result(column = "total_price",property = "totalPrice",id = false),// column配置关联表中的列名// property配置实体类中对应的属性@Result(column = "item_id",property = "item",id = false,// one配置关联的查询// one注解中的select配置对应的关联查询所在的接口中的方法// fetchType配置关联查询是即时查询,还是懒加载查询one=@One(select="com.qbzaixian.mapper.ItemMapper.findById",fetchType = FetchType.EAGER)),})public Orderdetail findOrderdetailAndItem(Integer id);
}
public interface ItemMapper {@Select("select * from tb_item where id = #{id}")public Item findById(Integer id);
}
@Test
public void testOneToOne(){SqlSession session = factory.openSession(true);OrderdetailMapper mapper = session.getMapper(OrderdetailMapper.class);Orderdetail orderdetail = mapper.findOrderdetailAndItem(1);System.out.println(orderdetail);
}

在MyBatis注解开发中,FetchType是一个枚举,它定义了关联对象的加载方式,主要有三个值:

  • LAZY:延迟加载:指示MyBatis在加载主对象时,不会主动加载关联对象,只有当访问关联对象属性时,才会发起加载。

  • EAGER:急加载:指示MyBatis在每次加载主对象时,会 joins 一并加载关联对象,相当于SQL的子查询。

  • DEFAULT:默认加载:指示MyBatis按照全局配置来决定使用延迟加载或急加载。

在MyBatis中,默认一对一采用急加载,一对多采用延迟加载。FetchType可以根据需要指定关联对象的加载方式。

5.2、注解一对多

查询订单信息,每个订单都关联着多个订单详情,需要使用@Results注解进行配置

public interface OrderMapper {@Select("select * from tb_order where id = #{id}")@Results(value = {@Result(property = "id",column = "id",id = true),@Result(property = "orderdetails",column = "id",many = @Many(select = "com.qbzaixian.mapper.OrderdetailMapper.findOrderdetailAndItem",fetchType = FetchType.LAZY))})public Order selectOrderAndOrderDetail(Integer id);
}
@Test
public void testOneToMany(){SqlSession session = factory.openSession(true);OrderMapper mapper = session.getMapper(OrderMapper.class);Order order = mapper.selectOrderAndOrderDetail(1);System.out.println(order);
}

5.3、注解多对多

上面演示的一对多的查询,由于在订单明细中关联查询了商品信息,其实上面的演示已经完成多对多的查询。

一个订单对应多个商品,每个商品可能被添加到不同的订单中。

6、注解开启缓存

注解开启二级缓存,只需要在类上添加@CacheNamespace,并且将blocking属性设置为true即可。

@CacheNamespace(blocking = true)
public class MyBatisTest2 {private SqlSessionFactory factory;
}

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

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

相关文章

钉钉公布AI版本商业定价,调用一次大模型不到5分钱

8月22日&#xff0c;在2023年钉钉生态大会上&#xff0c;钉钉总裁叶军公布了钉钉全面智能化的最新进展&#xff1a;已有17条产品线、55个场景全面接入大模型&#xff0c;完成智能化再造&#xff1b;钉钉同时面向生态伙伴和客户开放智能化底座AI PaaS&#xff0c;表示将用大模型…

学习设计模式之观察者模式,但是宝可梦

前言 作者在准备秋招中&#xff0c;学习设计模式&#xff0c;做点小笔记&#xff0c;用宝可梦为场景举例&#xff0c;有错误欢迎指出。 观察者模式 观察者模式定义了一种一对多的依赖关系&#xff0c;一个对象的状态改变&#xff0c;其他所有依赖者都会接收相应的通知。 所…

Windows 11 + Ubuntu20.04 双系统 坑里爬起来

ThinkPad x390 安装双系统&#xff0c;原有的磁盘太小&#xff0c;扩充了磁盘重新装系统&#xff0c;出现的问题&#xff0c;加以记录。 1. windows和ubuntu谁先安装&#xff0c;两个都可以&#xff0c;一般建议先安装windows&#xff0c;后安装ubuntu 2. 安装windows后&…

数据库系统课设——基于python+pyqt5+mysql的酒店管理系统(可直接运行)--GUI编程

几个月之前写的一个项目&#xff0c;通过这个项目&#xff0c;你能学到关于数据库的触发器知识&#xff0c;python的基本语法&#xff0c;python一些第三方库的使用&#xff0c;包括python如何将前后端连接起来&#xff08;界面和数据&#xff09;&#xff0c;还有界面的设计等…

3、Spring_容器执行

容器执行点 1.整合 druid 连接池 添加依赖 <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version> </dependency>1.硬编码方式整合 新建德鲁伊配置 <?xml version"1.…

Unity 之 ScreenPointToRay() (将点转换成射线的方法)

文章目录 ScreenPointToRay() ScreenPointToRay() ScreenPointToRay() 是Unity中Camera类的一个方法&#xff0c;用于将屏幕上的一个点转换为一条射线。这条射线的起点是摄像机在屏幕上对应的点&#xff0c;方向是从摄像机出发指向那个点。这在进行射线命中检测时非常有用&…

CTFhub-sql-整数注入

常用函数&#xff1a;version()、database()、user() 判断存在 sqli 注入 1 1 and 11 1 and 12 因为 11 为真&#xff0c;12 为假&#xff0c;且 11 与 1 显示的数据一样&#xff0c;那么就存在 sqli 注入 查询该数据表的字段数量 一、 2 3 1,2成功带出数据&#xff0c;3没…

el-button实现按钮,鼠标移入显示,移出隐藏

2023.8.18今天我学习了 如何实现鼠标移入显示按钮&#xff0c;鼠标移出隐藏按钮。 效果如图&#xff1a; 鼠标移入时&#xff1a; 鼠标移出时&#xff1a; mouseover //鼠标移入事件 mouseleave //鼠标移出事件 原本我是想直接在el-button写入这两个方法&#xff0c;但是elem…

ThreadLocal深度解析

简介 在并发编程中&#xff0c;导致并发bug的问题都会归结于对共享变量的操作不当。多个线程同时读写同一共享变量存在并发问题&#xff0c;我们可以利用写时复制、不变性来突破对原数据的写操作&#xff0c;没有写就没有并发问题&#xff0c;而本篇文章所介绍的技术是突破共享…

【使用Hilbert变换在噪声信号中进行自动活动检测】基于Hilbert变换和平滑技术进行自动信号分割和活动检测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Unity C# 之 Task、async和 await 、Thread 基础使用的Task的简单整理

Unity C# 之 Task、async和 await 、Thread 基础使用的Task的简单整理 目录 Unity C# 之 Task、async和 await 、Thread 基础使用的Task的简单整理 一、Task、async和 await 、Thread 基础概念 1、线程&#xff0c;多线程 2、Task 3、async &#xff08;await &#xff09;…

奥威BI数据可视化工具:个性化定制,打造独特大屏

每个人都有自己独特的审美&#xff0c;因此即使是做可视化大屏&#xff0c;也有很多人希望做出不一样的报表&#xff0c;用以缓解审美疲劳的同时提高报表浏览效率。因此这也催生出了数据可视化工具的个性化可视化大屏制作需求。 奥威BI数据可视化工具&#xff1a;个性化定制&a…

11. Vuepress2.x 关闭夜间模式

修改 docs/.vuepress/config.ts 配置文件 设置 themeConfig.darkMode属性详见 官网 module.exports {host: localhost, // ipport: 8099, //端口号title: 我的技术站, // 设置网站标题description: 描述&#xff1a;我的技术站,base: /, //默认路径head: [// 设置 favor.ico&a…

JVM及垃圾回收机制

文章目录 1、JVM组成&#xff1f;各部分作用&#xff1f;1.1 类加载器&#xff08;Class Loaders&#xff09;1.2 运行时数据区&#xff08;Runtime Data Area&#xff09;1.3 执行引擎&#xff08;Execution Engine&#xff09;1.4 本地方法接口&#xff08;Native Interface&…

Shader学习(三)(片元着色器)

1、在片元着色器处理漫反射 // Upgrade NOTE: replaced _World2Object with unity_WorldToObjectShader "Custom/specularfragement" {properties{_sp("Specular",color) (1,1,1,1)_shiness("Shiness",range(1,64)) 8}SubShader{pass {tags{&…

初始C语言(7)——详细讲解有关初阶指针的内容

系列文章目录 第一章 “C“浒传——初识C语言&#xff08;1&#xff09;&#xff08;更适合初学者体质哦&#xff01;&#xff09; 第二章 初始C语言&#xff08;2&#xff09;——详细认识分支语句和循环语句以及他们的易错点 第三章 初阶C语言&#xff08;3&#xff09;——…

Scrum的三个工件(产品Backlog、Sprint Backlog、产品增量 )

产品Backlog •产品backlog是一个按照价值排序的需求清单。 •为了达成产品目标&#xff0c;所有的需求都需要放到产品backlog中进行管理和规划。 •由产品负责人负责管理和维护。 产品Backlog当中的工作按照迭代的方式推进 •在Scrum中Sprint&#xff08;冲刺&#xff09…

前馈神经网络解密:深入理解人工智能的基石

目录 一、前馈神经网络概述什么是前馈神经网络前馈神经网络的工作原理应用场景及优缺点 二、前馈神经网络的基本结构输入层、隐藏层和输出层激活函数的选择与作用网络权重和偏置 三、前馈神经网络的训练方法损失函数与优化算法反向传播算法详解避免过拟合的策略 四、使用Python…

pytorch内存泄漏

问题描述&#xff1a; 内存泄漏积累过多最终会导致内存溢出&#xff0c;当内存占用过大&#xff0c;进程会被killed掉。 解决过程&#xff1a; 在代码的运行阶段输出内存占用量&#xff0c;观察在哪一块存在内存剧烈增加或者显存异常变化的情况。但是在这个过程中要分级确认…

光伏发电+boost+储能+双向dcdc+并网逆变器控制(低压用户型电能路由器仿真模型)【含个人笔记+建模参考】

MATALB代码链接&#xff1a;光伏发电boost十储能十双向dcdc十并网逆变器 个人笔记与建模参考请私信发送 包含Boost、Buck-boost双向DCDC、并网逆变器三大控制部分 boost电路应用mppt&#xff0c; 采用扰动观察法实现光能最大功率点跟踪 电流环的逆变器控制策略 双向dcdc储能系…