Mybatis要点总结

news2024/11/28 14:39:52

一、了解orm框架

        1.什么是ORM框架:对象关系映射(Object Relational Mapping,简称ORM),该模式是为了解决面向对象与关系数据库互补匹配的现象的技术;orm框架是连接数据库的桥梁,主要提供了人持久化与表之间的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据建库中;

        2.ORM框架的主要作用:为了解决面向对象关系与关系数据库互补匹配的问题;

        3.ORM常用框架:

        (1)Hibernate全自动映射框架,需要些hql语句

        (2)iBATIs半自动框架,自己编写sql语句,可操作性强

        (3)mybits半自动ORM映射框架

        (4)eclipseLink

        (5)JFinal

        4. ORM的优缺点:
        优点:
        (1)提高开发效率,降低开发成本
        (2)使开发更加对象化
        (3)可移植
        (4)可以很方便地引入数据缓存之类的附加功能
        缺点:
        (1)自动化进行关系数据库的映射需要消耗系统性能。其实这里的性能消耗还好啦,一般来说都可以忽略之。
        (2)在处理多表联查、where条件复杂之类的查询时,ORM的语法会变得复杂。

二、半自动与全自动的区别

        Hibrnate和mybatis是当前流行的ORM框架。hibernate对数据库结构提供了较为完整的封装。mybatis主要着力点在于java对象与SQL之间的映射关系。

       Hibrnate:使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以Hibernate是全自动ORM映射框架;

        Mybits:在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以Mybits是半自动ORM映射框架;

三、动态sql一对一、一对多、多对多的理解

        前提:创建user表和orders表

package com.itheima.domain;

import java.util.Date;
import java.util.List;

public class User {

    private int id;
    private String username;
    private String password;
    private Date birthday;

    //当前用户具备哪些角色
    private List<Role> roleList;

    public List<Role> getRoleList() {
        return roleList;
    }

    public void setRoleList(List<Role> roleList) {
        this.roleList = roleList;
    }

    //描述的是当前用户具有的订单
    private List<Order> orderList;
    public List<Order> getOrderList() {
        return orderList;
    }
    public void setOrderList(List<Order> orderList) {
        this.orderList = orderList;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", birthday=" + birthday +
                ", roleList=" + roleList +
                '}';
    }
}
package com.itheima.domain;

import java.util.Date;

public class Order {

    private int id;
    private Date ordertime;
    private double total;

    //当前订单属于哪一个用户
    private User user;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Date getOrdertime() {
        return ordertime;
    }

    public void setOrdertime(Date ordertime) {
        this.ordertime = ordertime;
    }

    public double getTotal() {
        return total;
    }

    public void setTotal(double total) {
        this.total = total;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public String toString() {
        return "Order{" +
                "id=" + id +
                ", ordertime=" + ordertime +
                ", total=" + total +
                ", user=" + user +
                '}';
    }
}

在sqlMapConfig.xml中加载映射关系

    <!--加载映射关系-->
    <mappers>
        <!--指定接口所在的包-->
        <!--<mapper resource="com.itheima.mapper/UserMapper.xml"></mapper>-->
        <package name="com.itheima.mapper"></package>

    </mappers>

   在web层中应用

package com.itheima.test;

import com.itheima.domain.Order;
import com.itheima.domain.User;
import com.itheima.mapper.OrderMapper;
import com.itheima.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MyBatisTest2 {

    private OrderMapper mapper;

    @Before
    public void before() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        mapper = sqlSession.getMapper(OrderMapper.class);
    }


  


}

        1.一对一:

                orders—>user:一个订单只由一个用户创建,一对一

                在测试类中实现测试一对一方法

package com.itheima.test;

import com.itheima.domain.Order;
import com.itheima.domain.User;
import com.itheima.mapper.OrderMapper;
import com.itheima.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MyBatisTest2 {

    private OrderMapper mapper;

    @Before
    public void before() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        mapper = sqlSession.getMapper(OrderMapper.class);
    }

    @Test
    public void test(){
        Order orders = mapper.findByOid(1);
        System.out.println(orders);
    }


}

OrderMapper
接口实现代码:

@Select("select * from orders o,user u where o.id=#{id} and o.uid=u.id")
    @Results({
            @Result(column = "id",property = "id"),
            @Result(column = "ordertime",property = "ordertime"),
            @Result(column = "total",property = "total"),
            @Result(
                    property = "user", //要封装的属性名称
                    column = "uid", //根据那个字段去查询user表的数据
                    javaType = User.class, //要封装的实体类型
                    //select属性 代表查询那个接口的方法获得数据
                    one = @One(select = "com.itheima.mapper.UserMapper.findById")
            )
    })
    public Order findByOid(int id);

 

        2.一对多:

                user---->orders:一个用户可以创建多个订单,一对多

                测试类实现代码:

package com.itheima.test;

import com.itheima.domain.Order;
import com.itheima.domain.User;
import com.itheima.mapper.OrderMapper;
import com.itheima.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MyBatisTest2 {

    private OrderMapper mapper;

    @Before
    public void before() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        mapper = sqlSession.getMapper(OrderMapper.class);
    }

    @Test
    public void test(){
        Order orders = mapper.findByOid(1);
        System.out.println(orders);
    }

    @Test
    public void test1(){
        List<Order> orders = mapper.findByUid(1);
        for (Order order : orders) {
            System.out.println(order);
        }
    }
    



}

OrderMapper
接口实现代码:

 @Select("select * from orders o,user u where uid=#{uid} and o.uid=u.id")
    @Results({
            @Result(column = "id",property = "id"),
            @Result(column = "ordertime",property = "ordertime"),
            @Result(column = "total",property = "total"),
            @Result(
                    property = "user", //要封装的属性名称
                    column = "uid", //根据那个字段去查询user表的数据
                    javaType = User.class, //要封装的实体类型
                    //select属性 代表查询那个接口的方法获得数据
                    one = @One(select = "com.itheima.mapper.UserMapper.findById")
            )
    })
    public List<Order> findByUid(int uid);

        3.多对多:

                完善一个中间类Role

package com.itheima.domain;

public class Role {

    private int id;
    private int roleId;
    private String roleName;
    private String roleDesc;

    private Order order;
    private User user;

    public int getRoleId() {
        return roleId;
    }

    public void setRoleId(int roleId) {
        this.roleId = roleId;
    }

    public Order getOrder() {
        return order;
    }

    public void setOrder(Order order) {
        this.order = order;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    public String getRoleDesc() {
        return roleDesc;
    }

    public void setRoleDesc(String roleDesc) {
        this.roleDesc = roleDesc;
    }

    @Override
    public String toString() {
        return "Role{" +
                "id=" + id +
                ", roleId=" + roleId +
                ", order=" + order +
                ", user=" + user +
                '}';
    }
}

               Role---> user---->orders:一个配送员对应多个订单号和客户信息

测试类实现代码:

  @Test
    public void test(){
        List<Role> list = roleMapper.findAll();
        for (Role role:list){
            System.out.println(role);
        }
    }

接口实现代码:

@Select("select * from sys_user_role ur,user u,orders o where ur.userID=u.id and ur.roleId=o.id")
    @Results({
            @Result(column = "userID",property = "id"),
            @Result(column = "roleId",property = "roleId"),
            @Result(
                    property = "user", //要封装的属性名称
                    column = "userID", //根据那个字段去查询user表的数据
                    javaType = User.class, //要封装的实体类型
                    //select属性 代表查询那个接口的方法获得数据
                    many = @Many(select = "com.itheima.mapper.UserMapper.findById")
            ),
            @Result(
                   property = "order",
                    column = "roleId",
                    javaType = Role.class,
                    many = @Many(select = "com.itheima.mapper.OrderMapper.findByOid")
            )
    })
    List<Role> findAll();
Role{id=1, roleId=1, order=Order{id=1, ordertime=Sat Oct 29 03:12:21 CST 2022, total=3000.0, user=User{id=1, username='张三', password='123456', birthday=null, roleList=null}}, user=User{id=1, username='张三', password='123456', birthday=null, roleList=null}}
Role{id=1, roleId=2, order=Order{id=2, ordertime=Fri Oct 28 08:00:00 CST 2022, total=5800.0, user=User{id=1, username='张三', password='123456', birthday=null, roleList=null}}, user=User{id=1, username='张三', password='123456', birthday=null, roleList=null}}
Role{id=2, roleId=2, order=Order{id=2, ordertime=Fri Oct 28 08:00:00 CST 2022, total=5800.0, user=User{id=1, username='张三', password='123456', birthday=null, roleList=null}}, user=User{id=2, username='李四', password='123456', birthday=null, roleList=null}}
Role{id=2, roleId=3, order=Order{id=3, ordertime=Sat Oct 29 03:13:20 CST 2022, total=323.0, user=User{id=2, username='李四', password='123456', birthday=null, roleList=null}}, user=User{id=2, username='李四', password='123456', birthday=null, roleList=null}}

四、一级缓存、二级缓存

         1.mybatis中为什么会存在缓存:

                缓存的意义是将用户查询的数据放入缓存(内存)中,用户再去查询相应的数据就不会直接从关系数据库中查询,直接从缓存中查询,从而提高了并发开发中的系统的性能问题

         2.Mybits的一级缓存是一个sqlSession级别的缓存,只能访问自己的一级缓存数据,而二级缓存是Mapper级别的缓存,是跨SQL Session的不同sqlSession是可以共享的缓存数据;

         3.一级缓存的原理:

第一次发出查询请求,sql 查询的结果写入SqlSession的一级缓存当中,缓存使用的数据结构是一个map<key, value>

key : hashcode + sql + sql输入参数 + 输出参数 (sql的唯一标识)
value : 用户信息
  同一个SqlSession再次发出相同的sql,就会从缓存中读取而不走数据库,如果两次操作之间出现commit(修改、输出、添加)操作,那么本SqlSession中一级缓存区域全部清空,下次再去缓存中查不到所以要从数据库中查询,从数据库再写入一级缓存。
https://blog.csdn.net/zy_zhangruichen/article/details/122592504icon-default.png?t=M85Bhttp://一级缓存原理

Mybatis 中一级缓存需要注意的点 :

Mybatis 中一级缓存是默认开启的,不需要手动配置。
Mybatis 和 Spring 整合后进行 mapper 代理开发后,不支持一级缓存。Mybatis 和 Spring 整合,Spring 按照 mapper 的模板去生成 mapper 代理对象,模板中在最后会统一关闭 SqlSession。
        4.二级缓存原理:

二级缓存的范围是mapper级别(mapper同一个命名空间),mapper以命名空间为单位创建缓存数据结构,结构是map<key, value>。每次查询前看是否开启了二级缓存,如果开启则从二级缓存的数据结构中取缓存数据,如果二级缓存中没有取到,再从一级缓存中取,如果一级缓存也没有,那就从数据库中查询。
        (1)需要在Mybatis的配置文件中<settings>标签中配置二级缓存:

<settings>
    <setting name="cacheEnabled" value="true"/> <!--Mybatis的二级缓存配置-->
</settings>

        (2)Mybatis的二级缓存的范围是mapper级别的,因此我们mapper如果想要使用二级缓存,还需要在对应的映射文件中配置<cache>标签

<mapper namespace="com.snow.xml.SnowOracle">
    <cache></cache> <!--Mybatis的二级缓存配置-->
</mapper>

五、Mybatis和Hibrnate区别

        1.Hibrnate:使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以Hibernate是全自动ORM映射框架;

       2. Mybits:在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以Mybits是半自动ORM映射框架;但mybits可以通过xml或注解方式灵活配置要运行的sql语句并将java对象和sql语句映射成最终执行的sql,最后将sql执行的结果在映射生成java对象

        3.Mybits学习门槛低,简单易学,程序员直接编写原生态sql,可以严格控制sql执行性灵活;但是mybits无法做到与数据库无关性,如果要实现支持多种数据库软件则需要自定义多套sql映射文件,工作量较大

        4.Hibernate 对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如
需求固定的定制化软件)如果用 hibernate 开发可以节省很多代码,提高效率。但是Hibernate 的缺点是学习门槛高,要精通门槛更高,而且怎么设计 O/R 映射,在性能和对象模型之间如何权衡,以及怎样用好 Hibernate 需要具有很强的经验和能力才行。总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。

六、分页查询插件

        1.需要在pom.xml文件中导入依赖

       <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>3.7.5</version>
        </dependency>
        <dependency>
            <groupId>com.github.jsqlparser</groupId>
            <artifactId>jsqlparser</artifactId>
            <version>0.9.1</version>
        </dependency>

         2.配置分页插件: 在sqlMapConfig.xml文件中配置

<!--配置分页助手插件-->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageHelper">
            <property name="dialect" value="mysql"></property>
        </plugin>
    </plugins>

        3.分页插件的使用

        测试类中的代码实现:

@Test
    public void test3() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        //设置分页相关参数   当前页+每页显示的条数
        PageHelper.startPage(1,3);

        List<User> userList = mapper.findAll();
        for (User user : userList) {
            System.out.println(user);
        }

        //获得与分页相关参数
        PageInfo<User> pageInfo = new PageInfo<User>(userList);
        System.out.println("当前页:"+pageInfo.getPageNum());
        System.out.println("每页显示条数:"+pageInfo.getPageSize());
        System.out.println("总条数:"+pageInfo.getTotal());
        System.out.println("总页数:"+pageInfo.getPages());
        System.out.println("上一页:"+pageInfo.getPrePage());
        System.out.println("下一页:"+pageInfo.getNextPage());
        System.out.println("是否是第一页:"+pageInfo.isIsFirstPage());
        System.out.println("是否是最后一页:"+pageInfo.isIsLastPage());

        sqlSession.close();
    }

测试结果:

 pageNum:当前页的页码
pageSize:每页显示的条数
size:当前页显示的真实条数
total:总记录数
pages:总页数
prePage:上一页的页码
nextPage:下一页的页码
isFirstPage/isLastPage:是否为第一页/最后一页
hasPreviousPage/hasNextPage:是否存在上一页/下一页
navigatePages:导航分页的页码数
navigatepageNums:导航分页的页码,[1,2,3,4,5]
 

七、延时加载

        1.什么是延迟加载:Mybatis中的延迟加载,也称为懒加载,是指在进行表的关联查询时,按照设置延迟规则推迟对关联对象的select查询,例如进行一对多查询时,之查询出一方数据,当程序中需要多方数据时,mybatis在发出sql语句进行查询,这样延迟加载就可以减少对数据库压力。Mybatis的延迟加载只是对关联对象的查询有延迟设置,对于主加载对象都是直接执行查询语句

        2.加载时机:直接加载:执行完对主加载对象的 select 语句,马上执行对关联对象的 select 查询。侵入式延迟: 执行对主加载对象的查询时,不会执行对关联对象的查询。但当要访问主加载对象的详情属性时,就会马上执行关联对象的select查询。深度延迟: 执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的select查询。只有当真正访问关联对象的详情时,才会执行对关联对象的 select 查询。

        注意:延迟加载的应用要求:关联对象的查询与主加载对象的查询必须是分别进行的select语句,不能是使用多表连接所进行的select查询。因为,多表连接查询,实质是对一张表的查询,对由多个表连接后形成的一张表的查询。会一次性将多张表的所有信息查询出来。

        3.入侵式延迟加载

①、sqlMapConfig.xml配置文件,首先开启延迟加载,然后再配置侵入式加载

八、Mybits中#与$的区别


<!--开启延迟加载-->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!--配置侵入式延迟加载   默认为false(深度加载)
      侵入式:默认只会执行主加载SQL,那么当访问主加载对象的详细信息时才会执行关联对象的SQL查询
      深度延迟:默认只执行主加载SQL,那么当调用到主加载对象中关联对象的信息时才会执行关联对象的SQL查询
    -->
    <setting name="aggressiveLazyLoading" value="true"/>

        4.深入式延迟加载

sqlMapConfig.xml配置文件,首先开启延迟加载,然后再配置深度加载

<!--开启延迟加载-->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!--配置侵入式延迟加载   默认为false(深度加载)
      侵入式:默认只会执行主加载SQL,那么当访问主加载对象的详细信息时才会执行关联对象的SQL查询
      深度延迟:默认只执行主加载SQL,那么当调用到主加载对象中关联对象的信息时才会执行关联对象的SQL查询
    -->
    <setting name="aggressiveLazyLoading" value="false"/>

延迟加载

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

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

相关文章

大数据技术之Zookeeper总结Ⅰ

zookeeper总结目录1. Zookeeper 入门1.1 zookeeper概述1.2 Zookeeper特点1.3 ZooKeeper 数据模型的结构2. Zookeeper 本地安装2.1 本地模式安装2.2 配置参数解读3. Zookeeper 集群操作3.1 集群操作3.2 Zookeeper 集群启动停止脚本3.3 客户端命令行语法1. Zookeeper 入门 1.1 z…

数据结构七:七大排序

目录 1&#xff1a;排序的概率 2.插入排序 2.1&#xff1a;直接插入排序-----稳定 2.1.1&#xff1a;基本思想 2.2&#xff1a;希尔排序 2.2.1&#xff1a;概念&#xff1a; 3.选择排序 3.1&#xff1a;选择排序 3.1.1&#xff1a;概念 3.2:堆排序 4.交换排序 4.1&…

微信小程序自动化测试之路

1. 前言 在每次发布新版本之前、都需要回归核心功能、已确保上线后小程序也能按照预期运行. 目前这部分回归工作是由测试同事手工去验证测试用例、按照每周一版本的迭代节奏、回归就花了测试挺多时间的. 最近前端工作比较轻松、故在思考能否把这部分重复的工作交给程序自动来进…

【EhCache: 一款Java的进程内缓存框架】EhCache 是什么、代码实战 Demo

文章目录1 EhCache 是什么2 代码实战 DemoTestEH.javaehcache.xml1 EhCache 是什么 Ehcache 是一种开源的、基于标准的缓存&#xff0c;可提高性能、卸载数据库并简化可扩展性。它是最广泛使用的基于 Java 的缓存&#xff0c;因为它健壮、经过验证、功能齐全&#xff0c;并且与…

python 基于PHP+MySQL的装修网站的设计与实现

至今为止,越来越多企业公司都已经实现了线上推广,提高了企业的运营工作效率,为装修公司设计一款强大的智能装修网,集企业信息展示和信息管理于一体,结合企业与外部的在线交流功能,主要用于大力宣传企业服务、企业产品等信息,让更多的人了解,提高企业的知名度 1&#xff1a;系统…

Spring Data Neo4j(1.对象映射)

文章目录一、Spring Data Neo4j二、注释NodeIdVersion(乐观锁)PropertyRelationship一、Spring Data Neo4j Spring Data Neo4j或简称SDN是下一代Spring Data模块&#xff0c;由Neo4j&#xff0c;Inc.创建和维护。与VMware的Spring Data Team密切合作。 它支持所有官方支持的Ne…

<Linux> shell运行原理及Linux权限的理解

文章目录一、shell 命令及其运行原理shell外壳shell运行原理二、Linux 权限的概念1.用户分类2.切换用户3.用户提权三、Linux 权限管理1.文件访问者的分类&#xff08;人&#xff09;2.文件类型和访问权限&#xff08;事物属性&#xff09;四、文件权限值的表示方法1.字符表示法…

Pycharm 配置远程SSH服务器环境(切换不同虚拟环境)

1.首先在Xshell上通过conda创建新的虚拟环境 2.此时在 /home/y210101004/.conda/envs下多了刚刚创建的环境的文件夹 3.路径说明&#xff01; &#xff08;注意&#xff01;&#xff09;该环境的编译器python3.6就在.../jiayan_test/bin里面 &#xff08;注意&#xff01;&…

04.函数

一、 函数 在计算机科学中&#xff0c;子程序&#xff08;英语&#xff1a;Subroutine, procedure, function, routine, method, subprogram, callable unit&#xff09;&#xff0c;是一个大型程序中的某部分代码&#xff0c; 由一个或多个语句块组 成。它负责完成某项特定任务…

ctfshow学习记录-misc入门(图片篇-颜色通道50-59)

目录misc50misc51misc52misc53misc54misc55misc56misc57misc58misc59misc51-52的wp和脚本参考的是csdn博主&#xff1a;z.volcano 九某人的碎碎念&#xff1a;这篇一更&#xff0c;说明近期是真的没有时间写wp了。虽说好多都是之前做过的题&#xff0c;但是wp整理起来还是比较耗…

OpenCV-Python 颜色识别(红色)并拟合矫正目标区域

OpenCV版本&#xff1a;4.6.0.66 算法实现思路&#xff1a; 颜色识别(红色)形态学去噪轮廓检测多边形拟合透视矫正代码实现&#xff1a; import cv2 import numpy as np# 可视化 def img_show(name, img):cv2.namedWindow(name, 0)cv2.resizeWindow(name, 1000, 500)cv2.imsh…

Java内存模型与volatile

Java内存模型 Java内存模型Java Memory Model&#xff0c;简称JMM&#xff0c;本身是一种抽象的概念并不真实存在它仅仅描述的是一组约定或规范&#xff0c;通过这组规范定义了程序中(尤其是多线程)各个变量的读写访问方式并决定一个线程对共享变量的写入何时以及如何变成对另…

白鹭群优化算法(ESOA)附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

单调区间能写成并吗?【基于间断区间的讨论】

不能。 问题 在做到一道题的时候&#xff0c;发现了两个减区间&#xff0c;于是就用并∪连接到一起了&#xff0c;但是答案是要用和连接。于是想要辨析一下这个并和和的区别。 区别 并&#xff1a;并的意思是将多个区间看成一个并起来的整体&#xff0c;在整个区间上仍然是…

按照 STAR 法则介绍自己做过的项目

大家好啊&#xff0c;我是大田 介绍项目注意两点&#xff1a;1、自己真的做过 2、逻辑表达能力 为什么推荐你用 STAR 法则说呢&#xff1f; STAR 法则是结构化面试中非常重要的理论。 面试官通过这样的描述全面了解你的测试知识、经验、技术能力的掌握程度&#xff0c;通过你发…

本地pycharm连接到远程服务器(超级详细)

本地pycharm连接到远程服务器&#xff08;超级详细&#xff09; 文章之前&#xff0c;你需要做的是 1.服务器需要创建好虚拟环境 2.你的本地安装好pycharm 目的是 同步服务器上的文件 在本地进行debug&#xff0c;并将修改后的文件进行更新 一般是将文件代码上传到服务器上面&…

【微服务】Sentinel 控制台

目录 1. 概述 2. 启动控制台 2.1 获取 Sentinel 控制台 2.2 启动 3. 客户端接入控制台 3.1 引入JAR包 3.2 配置启动参数 3.3 触发客户端初始化 4. 查看机器列表以及健康情况 5. 监控 5.1 "簇点链路"中显示刚刚调用的资源&#xff08;单机实时&#xff09; …

猿创征文|分享一下我的日常开发工具和常用软件

1、Eclipse IDE for Java Developers 这个软件&#xff0c;个人已经用了很多年的免费 Java 开发软件。 1&#xff09;配置JDK 2&#xff09;新建项目 3&#xff09;运行使用 这里注意到有 Run As 和 Debug As ,区别就是后者是调试模式&#xff0c;你可以在代码任意处打断点跟…

element-ui中获取el-divider的组件的ref时为空

element-ui中的el-divider组件是函数式组件,所以当我尝试获取其ref时总是获取不到,因为函数式组件没有this. ![在这里插入图片描述](https://img-blog.csdnimg.cn/496711bf5c2a4dd1bee168e4e2d638d4.png)此时打印this.$refs,控制台输出: 没有h2,翻看el-divider源码发现是函数式…

C++入门学习3-指针与字符数组,函数,指针数组

c入门学习3char型指针的使用p*p*p与p与[整型指针指向整型数组]的区别指针与函数的使用指向函数的指针空指针调用函数从函数中返回指针一维数组和二维数组的类比CHAR型指针数组关于&achar型指针的使用 char型指针可以直接指向一个字符串&#xff0c;如下 char s[]{a,b,c};…