Mybatis进阶(映射关系一对一 )

news2024/11/23 19:20:50

文章目录

    • 1.基本介绍
        • 1.基本说明
        • 2.映射方式
    • 2.配置xml方式(多表联查)
        • 1.数据库表设计
        • 2.新建子模块
          • 1.创建子模块
          • 2.创建基本结构
        • 3.MyBatisUtils.java和jdbc.properties和mybatis-config.xml与原来的一致
        • 4.IdenCard.java
        • 5.Person.java
        • 6.IdenCardMapper.java
        • 7.IdenCardMapper.xml(名字需要与前面的接口名相同!!!)
        • 8.IdenCardMapperTest.java测试
        • 9.PersonMapper.java
        • 10.PersonMapper.xml(一对一关系体现)
        • 11.测试PersonMapperTest.java
        • 12.查询优化
        • 13.对一对一关系的理解
          • 1.对IdenCard和Person属性的分析
            • 1.IdenCard
            • 2.Person
          • 2.查询出来的结果
    • 3.配置xml方式(多表联查分解为单表操作)
        • 1.PersonMapper.java添加方法
        • 2.PersonMapper.xml添加查询
        • 3.测试
    • 4.注解方式
        • 1.基本介绍
        • 2.代码实现
        • 1.IdenCardMapperAnnotation.java
        • 2.PersonMapperAnnotation.java
        • 3.PersonMapperAnnotationTest.java测试
    • 5.注意事项和细节
        • 1.表是否设置外键,对MyBatis级联映射没有影响
        • 2.关于ResultMap
    • 6.课后练习
        • 1.IdenCard.java添加属性Person用来关联person表
        • 2.IdenCardMapper.java添加方法
        • 3.IdenCardMapper.xml添加实现类
        • 4.PersonMapper.java根据card_id查询
        • 5.PersonMapper.xml添加实现类
        • 6.测试IdenCardMapperTest.java
    • 7.一对一映射总结(idencard和person)
        • 1.设计表
          • idencard表字段
          • person表字段
          • 分析映射关系(person -> idencard)
        • 2.设计bean(person -> idencard)
          • Idencard
          • Person
        • 3.设计查询
          • 根据person的id查询时级联查询idencard,返回一个Person对象
        • 4.映射(idencard -> person)
          • 1.设计bean
          • 2.设计查询
            • 根据idencard的id查询时级联查询person,返回一个Idencard对象

1.基本介绍

1.基本说明

image-20240305184650313

2.映射方式

image-20240305184825137

2.配置xml方式(多表联查)

image-20240305185156581

1.数据库表设计
-- 记录身份证的表
CREATE TABLE idencard(
id INT PRIMARY KEY auto_increment,
card_sn VARCHAR(32) NOT NULL DEFAULT ''
);
INSERT INTO idencard VALUES(1, '111111000');

-- 记录个人信息的表
CREATE TABLE person(
id INT PRIMARY KEY auto_increment,
name VARCHAR(32) NOT NULL,
card_id INT,
FOREIGN KEY (card_id) REFERENCES idencard(id)
);
INSERT INTO person VALUES(1, '牛魔王', 1);

2.新建子模块
1.创建子模块

image-20240305191310416

2.创建基本结构

image-20240305195323326

3.MyBatisUtils.java和jdbc.properties和mybatis-config.xml与原来的一致
4.IdenCard.java
package com.sun.entity;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class IdenCard {
    private Integer id;
    private String card_sn;

    public IdenCard() {
    }

    public Integer getId() {
        return id;
    }

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

    public String getCard_sn() {
        return card_sn;
    }

    public void setCard_sn(String card_sn) {
        this.card_sn = card_sn;
    }

    @Override
    public String toString() {
        return "IdenCard{" +
                "id=" + id +
                ", card_sn='" + card_sn + '\'' +
                '}';
    }
}

5.Person.java
package com.sun.entity;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class Person {
    private Integer id;
    private String name;
    private IdenCard card; //这个名称随意,因为后面是要通过映射

    public Person() {
    }

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public IdenCard getCard() {
        return card;
    }

    public void setCard(IdenCard card) {
        this.card = card;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", card=" + card +
                '}';
    }
}

6.IdenCardMapper.java
package com.sun.mapper;

import com.sun.entity.IdenCard;

/**
 * @author 孙显圣
 * @version 1.0
 */
public interface IdenCardMapper {
    public IdenCard getIdenCardById(Integer id);
}

7.IdenCardMapper.xml(名字需要与前面的接口名相同!!!)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--指定该xml文件和哪个接口对应-->
<mapper namespace="com.sun.mapper.IdenCardMapper">
    <!--public IdenCard getIdenCardById(Integer id);-->
    <select id="getIdenCardById" resultType="IdenCard" parameterType="Integer">
        SELECT *
        FROM idencard
        WHERE id = #{id}
    </select>
</mapper>
8.IdenCardMapperTest.java测试
import com.sun.entity.IdenCard;
import com.sun.mapper.IdenCardMapper;

import com.util.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Before;
import org.junit.Test;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class IdenCardMapperTest {
    //两个属性
    private SqlSession sqlSession; //相当于连接
    private IdenCardMapper idenCardMapper;

    //编写方法完成初始化
    @Before //标注了Before之后表示了在执行目标测试方法前会执行该方法
    public void init() {
        //获取到sqlSession
        sqlSession = MyBatisUtils.getSqlSession();
        //获取到MonsterMapper对象
        idenCardMapper = sqlSession.getMapper(IdenCardMapper.class);
        System.out.println(idenCardMapper.getClass());
    }
    @Test
    public void getIdenCardById() {
        IdenCard idenCardById = idenCardMapper.getIdenCardById(1);
        System.out.println(idenCardById);

        if (sqlSession != null) {
            sqlSession.close();
        }
    }
}

image-20240305195715472

9.PersonMapper.java
package com.sun.mapper;

import com.sun.entity.Person;

/**
 * @author 孙显圣
 * @version 1.0
 */
public interface PersonMapper {
    public Person getPersonById(Integer id);
}

10.PersonMapper.xml(一对一关系体现)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--指定该xml文件和哪个接口对应-->
<mapper namespace="com.sun.mapper.PersonMapper">
    <!--返回结果集
        将查询到的结果封装到Person对象里,在Person对象的属性有
            private Integer id; person表的id
            private String name; person表的name
            private IdenCard card; person表的card_id
            一个card_id就可以找到一个IdenCard对象,也就是一个idencard表的一条记录,
            所以就使用了这个IdenCard对象来替换原来的card_id,如果将结果封装到这个Person对象中
            则应该显示的表字段为:id(person表的id) name(person表的name) id(idencard表的id) card_sn(idencard表的card_sn)
            这样就舍弃掉了原来person表的card_id字段,可以认为这两个表中person表是主表
    -->
    <resultMap id="getPersonByIdResult" type="Person">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <association property="card" javaType="IdenCard">
            <result property="id" column="id"/>
            <result property="card_sn" column="card_sn"/>
        </association>
    </resultMap>
    <!--public Person getPersonById(Integer id);-->
    <select id="getPersonById" parameterType="Integer" resultMap="getPersonByIdResult">
        SELECT *
        FROM person,
             idencard
        WHERE person.card_id = idencard.id
          AND person.id = #{id}
    </select>

</mapper>

11.测试PersonMapperTest.java
import com.sun.entity.Person;
import com.sun.mapper.IdenCardMapper;
import com.sun.mapper.PersonMapper;
import com.util.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Before;
import org.junit.Test;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class PersonMapperTest {
    //两个属性
    private SqlSession sqlSession; //相当于连接
    private PersonMapper personMapper;

    //编写方法完成初始化
    @Before //标注了Before之后表示了在执行目标测试方法前会执行该方法
    public void init() {
        //获取到sqlSession
        sqlSession = MyBatisUtils.getSqlSession();
        //获取到MonsterMapper对象
        personMapper = sqlSession.getMapper(PersonMapper.class);
        System.out.println(personMapper.getClass());
    }
    @Test
    public void getPersonById() {
        Person personById = personMapper.getPersonById(1);
        System.out.println(personById);
    }
}

image-20240305210043758

12.查询优化

image-20240305211114063

13.对一对一关系的理解
1.对IdenCard和Person属性的分析
1.IdenCard
  • id属性对应表的id字段
  • card_sn属性对应表的card_sn字段

image-20240305210408972

2.Person
  • id属性对应表的id字段
  • name属性对应表的name字段
  • **card属性:**原本的person表应该是一个card_id字段,但是这个card_id字段是可以映射到idencard表的一条记录即在java中的IdenCard对象,所以使用这个对象来替代了原来的card_id字段

image-20240305210318752

2.查询出来的结果

image-20240305210837571

  • 可以看出这个上面的结果只有四个字段,也就是删除了person表中原有的card_id字段!

image-20240305210212573

3.配置xml方式(多表联查分解为单表操作)

1.PersonMapper.java添加方法
    public Person getPersonById2(Integer id);
2.PersonMapper.xml添加查询
    <!--2.获取到了查询到的值Columns: id, name, card_id(外键)-->
    <resultMap id="getPersonByIdResult2" type="Person">
        <!--3.将查询到的id值调用Person对象的setId方法赋值-->
        <id property="id" column="id"/>
        <!--4.将查询到的name值调用Person对象的setName方法赋值-->
        <result property="name" column="name"/>
        <!--5.将查询到的card_id值作为参数,传给select语句调用的方法-->
        <!--6.select语句将返回的Card对象封装到card属性中-->
        <association property="card" column="card_id" select="com.sun.mapper.IdenCardMapper.getIdenCardById"/>
    </resultMap>
    <!--1.可以理解为这里将查询到的值给了id为getPersonByIdResult2的resultMap-->
    <select id="getPersonById2" parameterType="Integer" resultMap="getPersonByIdResult2">
        select * from person where id = #{id}
    </select>
3.测试

image-20240305220418082

4.注解方式

1.基本介绍

image-20240306085032938

2.代码实现
1.IdenCardMapperAnnotation.java
package com.sun.mapper;

import com.sun.entity.IdenCard;
import org.apache.ibatis.annotations.Select;

/**
 * @author 孙显圣
 * @version 1.0
 */
public interface IdenCardMapperAnnotation {
    @Select("select * from `idencard` where `id` = #{id}")
    public IdenCard getIdenCardById(Integer id);
}


2.PersonMapperAnnotation.java
package com.sun.mapper;

import com.sun.entity.Person;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

/**
 * @author 孙显圣
 * @version 1.0
 */
public interface PersonMapperAnnotation {
    @Results({
            @Result(id = true, property = "id", column = "id"),
            @Result(property = "name", column = "name"),
            //将查询到的card_id作为入参传给getIdenCardById方法,最后返回一个Card对象,然后调用setter方法封装到card
            @Result(property = "card", column = "card_id", one = @One(select = "com.sun.mapper.IdenCardMapperAnnotation.getIdenCardById"))
    }
    )
    //根据id查询Person表
    @Select("select * from `person` where id = #{id}")
    public Person getPersonById(Integer id);
}

3.PersonMapperAnnotationTest.java测试
import com.sun.entity.Person;
import com.sun.mapper.PersonMapper;
import com.sun.mapper.PersonMapperAnnotation;
import com.util.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Before;
import org.junit.Test;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class PersonMapperAnnotationTest {
    //两个属性
    private SqlSession sqlSession; //相当于连接
    private PersonMapperAnnotation personMapperAnnotation;

    //编写方法完成初始化
    @Before //标注了Before之后表示了在执行目标测试方法前会执行该方法
    public void init() {
        //获取到sqlSession
        sqlSession = MyBatisUtils.getSqlSession();
        //获取到MonsterMapper对象
        personMapperAnnotation = sqlSession.getMapper(PersonMapperAnnotation.class);
        System.out.println(personMapperAnnotation.getClass());
    }
    @Test
    public void PersonMapperAnnotation() {
        Person personById = personMapperAnnotation.getPersonById(1);
        System.out.println(personById);
        if (sqlSession != null) {
            sqlSession.close();
        }
    }

}

image-20240306092007450

5.注意事项和细节

1.表是否设置外键,对MyBatis级联映射没有影响
2.关于ResultMap
  • MyBatis默认机制是调用查询到的列名的setter方法给返回的类型对象的属性赋值,但是如果列名与属性名不对应就只能使用ResultMap来进行映射
  • ResultMap中的column属性实际上指的是查询到的结果的列名,如果有别名则这个列就应该对应这个别名
  • 如果有select属性,则指的是将这个column的值传给select属性对应的方法并得到返回值,然后调用property属性的setter方法为其赋值

image-20240306092330326

6.课后练习

image-20240306111556037

1.IdenCard.java添加属性Person用来关联person表
  • 由于person表的card_id对应于idencard表的id,所以数据表不需要变化
package com.sun.entity;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class IdenCard {
    private Integer id;
    private String card_sn;
    private Person person; //IdenCard的id对应Person的card_id

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    public IdenCard() {
    }

    public Integer getId() {
        return id;
    }

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

    public String getCard_sn() {
        return card_sn;
    }

    public void setCard_sn(String card_sn) {
        this.card_sn = card_sn;
    }

    @Override
    public String toString() {
        return "IdenCard{" +
                "id=" + id +
                ", card_sn='" + card_sn + '\'' +
                ", person=" + person +
                '}';
    }
}

2.IdenCardMapper.java添加方法
    public IdenCard getIdenCardById2(Integer id);
3.IdenCardMapper.xml添加实现类
  • 首先根据id查询idencard表的id和card_sn
  • 将查询到的结果填充到IdenCard的id和card_sn属性中
  • 再使用id调用person表的方法,当作person表的card_id来查到person表的数据并填充到IdenCard的Person属性中
    <!--public IdenCard getIdenCardById2(Integer id);-->
    <resultMap id="getIdenCardById2ResultMap" type="IdenCard">
        <id property="id" column="id"/>
        <result property="card_sn" column="card_sn"/>
        <association property="person" column="id" select="com.sun.mapper.PersonMapper.findByCard_Id"/>
    </resultMap>
    <!--public IdenCard getIdenCardById(Integer id);-->
    <select id="getIdenCardById2" resultMap="getIdenCardById2ResultMap" parameterType="Integer">
        SELECT *
        FROM idencard
        WHERE id = #{id}
    </select>
4.PersonMapper.java根据card_id查询
    //根据card_id查询person
    public Person findByCard_Id(Integer card_id);
5.PersonMapper.xml添加实现类
    <!--public Person findByCard_Id(Integer card_id);-->
    <select id="findByCard_Id" parameterType="Integer" resultType="Person">
        SELECT * FROM person WHERE card_id = #{card_id}
    </select>
6.测试IdenCardMapperTest.java
import com.sun.entity.IdenCard;
import com.sun.mapper.IdenCardMapper;

import com.util.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Before;
import org.junit.Test;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class IdenCardMapperTest {
    //两个属性
    private SqlSession sqlSession; //相当于连接
    private IdenCardMapper idenCardMapper;

    //编写方法完成初始化
    @Before //标注了Before之后表示了在执行目标测试方法前会执行该方法
    public void init() {
        //获取到sqlSession
        sqlSession = MyBatisUtils.getSqlSession();
        //获取到MonsterMapper对象
        idenCardMapper = sqlSession.getMapper(IdenCardMapper.class);
        System.out.println(idenCardMapper.getClass());
    }
    @Test
    public void getIdenCardById2() {
        IdenCard idenCardById2 = idenCardMapper.getIdenCardById2(1);
        System.out.println(idenCardById2);
        if (sqlSession != null) {
            sqlSession.close();
        }
    }


}

image-20240306134453671

7.一对一映射总结(idencard和person)

1.设计表
idencard表字段
  • id
  • card_sn
person表字段
  • id
  • name
  • card_id
分析映射关系(person -> idencard)
  • 一个person对应一个idencard
  • 表person添加字段card_id来映射idencard表的id
2.设计bean(person -> idencard)
Idencard
  • id
  • card_sn
Person
  • id
  • name
  • Idencard(映射idencard表)
3.设计查询
根据person的id查询时级联查询idencard,返回一个Person对象
  • 首先根据person的id查询到
    • id(填充到Person)
    • name(填充到Person)
    • card_id
  • 再根据person的card_id查询idencard表
    • id(填充到Idencard对象)
    • card_sn(填充到Idencard对象)
  • 将Idencard对象封装到Person对象的属性
4.映射(idencard -> person)
1.设计bean
  • 由于idencard的id对应person的card_id
  • 所以表不需要变化
  • idencard 的bean添加字段Person映射表person
2.设计查询
根据idencard的id查询时级联查询person,返回一个Idencard对象
  • 首先根据idencard的id查询
    • id(填充到Idencard)
    • card_sn(填充到Idencard)
  • 然后根据查询到的id,查询person表的card_id字段
    • id(填充到Person对象)
    • name(填充到Person对象)
    • card_id
  • 将Person对象封装到Idencard对象的属性

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

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

相关文章

【漏洞复现】北京中科聚网一体化运营平台catchByUrl存在文件上传漏洞

漏洞描述 北京中科聚网一体化运营平台 catchByUrl存在文件上传漏洞,未经身份验证的攻击者可利用此漏洞上传后门文件,从而获取服务器权限。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安…

订票系统|基于Springboot+vue的火车票订票系统(源码+数据库+文档)

订票系统目录 基于Springbootvue的火车票订票系统 一、前言 二、系统设计 三、系统功能设计 1会员信息管理 2 车次信息管理 3订票订单管理 4留言板管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍…

小区服务|基于SprinBoot+vue的小区服务管理系统(源码+数据库+文档)

目录 基于SprinBootvue的小区服务管理系统 一、前言 二、系统设计 三、系统功能设计 1管理员登录 2 客服聊天管理、反馈管理管理 3 公告信息管理 4公告类型管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博…

cmake的使用方法: 生成库文件

一. 简介 前面文章学习了针对单个 .c文件&#xff0c;cmake 工具是如何编译的&#xff1f; 针对包含多个 .c文件&#xff0c;cmake工具又是如何编译的&#xff1f;文章如下&#xff1a; cmake的使用方法: 单个源文件的编译-CSDN博客 cmake的使用方法: 多个源文件的编译-CS…

css---浮动知识点精炼汇总

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 浮动简单理解与介绍 这是我们普通的页面标签效果。 每个标签从上到下依次排列。 浮动顾名思义就是让这个标签飞翔起来。 他飞起来后&#xff0c;后面的标签来到他的位置上。 而浮动的标签就会显示在标签的上面。…

【webrtc】MessageHandler 9: 基于线程的消息处理:执行Port销毁自己

Port::Port 构造的时候,就触发了一个异步操作,但是这个操作是要在 thread 里执行的,因此要通过post 消息 MSG_DESTROY_IF_DEAD 到thread跑:port的创建并米有要求在thread中 但是port的析构却在thread里 这是为啥呢?

Redis__事务

文章目录 &#x1f60a; 作者&#xff1a;Lion J &#x1f496; 主页&#xff1a; https://blog.csdn.net/weixin_69252724 &#x1f389; 主题&#xff1a;Redis__事务 ⏱️ 创作时间&#xff1a;2024年05月02日 ———————————————— 这里写目录标题 文章目…

【机器学习】机器学习在教育领域的应用场景探索

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

Easy TCP Analysis上线案例库功能,为用户提供一个TCP抓包分析案例分享学习的平台

​案例库&#xff0c;提供给用户相互分享TCP抓包故障排查案例或是经典学习案例的功能&#xff0c;任何用户都可从案例库查看其它用户分享的案例&#xff0c;每个用户也都可以上传自己的案例&#xff0c;经过平台审核去重即可展示在案例库。 对于学习&#xff0c;最典型的三次握…

智能物联网与Web3:连接未来数字生活的桥梁

随着科技的不断进步&#xff0c;智能物联网&#xff08;IoT&#xff09;和Web3技术正成为数字化时代的关键驱动力。智能物联网将各种物理设备连接到互联网&#xff0c;使其能够感知环境、收集数据并与其他设备通信&#xff0c;而Web3技术则以去中心化、安全性和透明性为核心&am…

吴恩达深度学习笔记:深度学习的 实践层面 (Practical aspects of Deep Learning)1.9-1.10

目录 第二门课&#xff1a; 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第一周&#xff1a;深度学习的 实践层面 (Practical aspects of Deep Learning)1.9 归一…

Dom获取属性操作

目录 1. 基本认知 1.1 目的和内容 1.2 什么是DOM 1.3 DOM对象 1.4 DOM树 2. 获取DOM元素对象 2.1 选择匹配到的第一个元素 2.2 选择匹配到的多个元素 2.3 其他获取DOM元素方法 3. 操作元素内容 3.1 元素对象.innerText 属性 3.2 元素对象.innerHTML 属性 4. 操作元…

力扣题目:寻找数组的中心下标

力扣题目&#xff1a;寻找数组的中心下标 题目链接: 724.寻找数组的中心下标 题目描述 代码思路 根据题目内容&#xff0c;维护好前后缀和&#xff0c;然后从左到右遍历寻找合适的下标 代码纯享版 class Solution {public int pivotIndex(int[] nums) {int sumleft 0, su…

Visual Studio安装MFC开发组件

MFC由于比较古老了&#xff0c;Visual Studio默认没有这个开发组件。最近由于一些原因&#xff0c;需要使用这个库&#xff0c;这就需要另外安装。 参考了网上的一些资料&#xff0c;根据实际使用&#xff0c;其实很多步骤不是必须的。 https://zhuanlan.zhihu.com/p/68117276…

ios CI/CD 持续集成 组件化专题四-(手动发布私有库-组件化搭建)

一 、创建私有索引库 1.1 、第一步 首先检查本地是否存在需要的私有索引库 pod repo list 例如&#xff1a;dp_base_ios_spec 在本地不存在该私有索引库 1.2 、第二步 在git下下创建一个新的库&#xff0c;这个库用来保存私有库的podspec文件&#xff0c;取名叫xxxSpec用以…

如何使用Go语言进行基准测试(benchmark)?

文章目录 一、基准测试的基本概念二、编写基准测试函数三、运行基准测试四、优化代码性能五、注意事项总结 在Go语言中&#xff0c;基准测试&#xff08;benchmark&#xff09;是一种评估代码性能的有效方式。通过基准测试&#xff0c;我们可以测量代码执行的时间、内存使用情况…

MAT分析内存溢出

一. 下载地址 MAT工具&#xff0c;可以单独下载&#xff0c;记得和JDK进行适配&#xff0c;可以不用下载eclipse 下载地址: https://eclipse.dev/mat/downloads.php 二. MAT内存溢出本地代码测试 package com.sohu.test.method;import java.util.ArrayList; import java.ut…

Dashboard 安装部署

Dashboard 安装部署 Dashboard 安装部署 一&#xff1a;下载 二&#xff1a;部署步骤 1.镜像下载及导入 国内直接拉外网镜像会失败&#xff0c;可在境外下载镜像 查看 deployment 里的镜像版本 Dashboard Deploymentcontainers:- name: kubernetes-dashboardimage: k8s.g…

二叉树的遍历算法

目录 1.二叉树结构 2.广度优先搜索二叉树&#xff08;迭代算法&#xff09; 3.深度优先搜索二叉树&#xff08;递归算法&#xff09; 1.二叉树结构 一个父结点&#xff0c;至多可以连接左右两个子节点 Java构造树结构——其实是 自定义树结点类型 public class TreeNode {in…

【数据结构】链表专题3

前言 本篇博客我们继续来讨论链表专题&#xff0c;今天的链表算法题是经典中的经典 &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;数据结构 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 目录 1.判断链表是否…